【发布时间】:2012-02-03 16:51:44
【问题描述】:
看看这段代码(来自here)
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();
}
}
有两个并行的继承树,一个父类和一个关联类。问题出在第 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();
是吗?这太酷了。我想我会用它!
【问题讨论】:
-
如果你写
AssocAConcrete myA;而不是AssocA myA;(第2行),它会解决它。但这会破坏其余的代码吗? -
是的,整个想法是 AssocAConcrete 可能有不同的变体,EntityA 的客户不希望依赖它。请注意,仅使用 AssocA 和 EntityA 的代码永远不会知道或提及其中一个或另一个 Concrete 类。而且只有两个具体的“A”类知道实现细节。
标签: java oop inheritance