Spójrz na ten kod (od here)Dziedziczenie i przesyłanie: czy to jest dobra wersja Java?
abstract class EntityA {
AssocA myA;
abstract void meet();
}
abstract class AssocA {
int something;
abstract void greet();
}
class AssocAConcrete extends AssocA {
void greet() {
System.out.println("hello");
}
void salute() {
System.out.println("I am saluting.")
}
}
class EntityAConcrete extends EntityA {
void meet() {
System.out.println("I am about to meet someone");
((AssocAConcrete)myA).salute();
}
}
Istnieją dwa równoległe spadkowe drzewa, dla klasy dominującej i powiązanej klasy. Problem jest z linii 23:
((AssocAConcrete)myA).salute();
Jest to ból i mam coś takiego w całym moim kodu. Chociaż ta linia jest częścią konkretnej implementacji Entity, muszę przypomnieć, że chcę użyć konkretnej implementacji AssocA, Assocaconcrete.
Czy jest jakiś rodzaj adnotacji, aby zadeklarować ten związek? Czy istnieje lepszy, bardziej kolokwialny sposób Java do wyrażenia tego projektu? Dzięki!
Jest to odpowiedź na @Dave, ponieważ chcę, aby umieścić jakiś kod w ...
Ciekawe! Tak więc inwokacja wyglądałaby tak:
AssocAConcrete myAssoc = new Assoca();
EnitityA<T extends AssocA> myEntity = new EntityA<AssocAConcrete>();
myEntity.setAssoc(myAssoc);
myAssoc.salute();
Tak? To jest naprawdę fajne. Myślę, że go użyję!
Jeśli napiszesz 'AssocAConcrete myA;' zamiast 'AssocA myA;' (linia 2), rozwiąże to. Ale czy to złamie resztę kodu? –
Tak, cała idea jest taka, że mogą istnieć różne warianty AssocAConcrete, a klienci EntityA nie chcieliby być od tego zależni. Zauważ, że kod, który używa właśnie AssocA i EntityA nigdy nie zna ani nie wspomina o jednej lub drugiej klasie Concrete. I tylko dwie konkretne klasy "A" kiedykolwiek znają szczegóły implementacji. – pitosalas