Date un'occhiata a questo codice (da here)Ereditarietà e casting: è buono questo 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();
}
}
Ci sono due alberi di ereditarietà in parallelo, per una classe genitore e una classe associata. Il problema è con la linea 23:
((AssocAConcrete)myA).salute();
è un dolore e non ho questo genere di cose in tutto il mio codice. Anche se questa linea è parte dell'implementazione concreta di Entity, devo ricordarmi che voglio utilizzare l'implementazione concreta di AssocA, AssocAConcrete.
C'è qualche tipo di annotazione per dichiarare tale relazione? O c'è un modo migliore, più colloquiale in Java per esprimere questo design? Grazie!
Questo è in risposta a @ Dave, perché voglio mettere un po 'di codice in ...
Interessante! Quindi l'invocazione sarebbe simile a questa:
AssocAConcrete myAssoc = new Assoca();
EnitityA<T extends AssocA> myEntity = new EntityA<AssocAConcrete>();
myEntity.setAssoc(myAssoc);
myAssoc.salute();
Sì? È davvero fantastico. Penso che lo userò!
Se scrivi 'AssocAConcrete myA;' invece di 'AssocA myA;' (riga 2), lo risolverebbe. Ma ciò interromperà il resto del codice? –
Sì, l'idea generale è che potrebbero esserci diverse varianti di AssocAConcrete ei client di EntityA vorrebbero non essere dipendenti da questo. Si noti che il codice che utilizza solo AssocA e EntityA non conosce o menziona mai l'una o l'altra classe Concrete. E solo le due classi concrete "A" conoscono i dettagli dell'implementazione. – pitosalas