は、親クラスと関連付けられたクラスに対して、二つの平行な継承ツリーがあります継承とキャスティング:この良い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();
}
}
(hereから)このコードを見てみましょう。問題は、23行目である:
((AssocAConcrete)myA).salute();
それは苦痛であると私はすべての私のコードの上にもののようなものを持っています。その行はEntityの具体的な実装の一部ですが、AssocA、AssocAConcreteの具体的な実装を使用したいと思います。
この関係を宣言するための注釈がありますか?あるいは、このデザインを表現するために、より優れた、口語的なJavaの方法がありますか?ありがとう!
私は...
興味深いいくつかのコードを入れたいので、これは、@Daveに対応しています!だから、呼び出しは次のようになります。
AssocAConcrete myAssoc = new Assoca();
EnitityA<T extends AssocA> myEntity = new EntityA<AssocAConcrete>();
myEntity.setAssoc(myAssoc);
myAssoc.salute();
はい?かっこいい。私はそれを使用すると思います!
'AssocA myA;'(2行目)の代わりに 'AssocAConcrete myA;'と書くと、それが解決します。しかし、それはコードの残りの部分を破るだろうか? –
ええ、全体的な考え方は、AssocAConcreteのさまざまなバリエーションがあり、EntityAのクライアントがそれに依存したくないということです。 AssocAとEntityAだけを使用するコードでは、どちらか一方または他のConcreteクラスを認識したり、言及したりしないことに注意してください。 2つのコンクリート "A"クラスだけが実装の詳細を知っています。 – pitosalas