假设我有两个名为“SuperClass”和SubClass的类。 SubClass扩展了SuperClass。
我刚刚发现SuperClass不可能有一个SubClass类型的实例变量。
也就是说,这不起作用:
class SuperClass{
SubClass x = new SubClass();
}
因为它导致构造函数相互调用,进入永久循环。 (因为Java会自动调用Super())
创建子类实例变量是不可能的,也是一个糟糕的设计理念?还是有某种解决方法?
答案 0 :(得分:2)
这通常是一个坏主意。如果你的超类需要一个子类的实例,那就是代码味道。它创建了循环依赖关系并建议破坏分析。
解决方法/修复通常是将超类使用的任何代码从子类引入超类。
答案 1 :(得分:0)
唯一的限制是在超类构造函数中放置子类的分配(或者,就此而言,另一个超类的实例)。你当然可以拥有一个具有子类类型的实例字段,并在构造超类之后的某个时刻设置它。 (虽然你显然需要通过setter方法阻止任何递归。)
实际上,如果构造函数中有条件逻辑在构造子类时跳过分配,那么可以将分配放在超类构造函数中。例如:
class SuperClass {
SubClass subClassField;
SuperClass() {
if (!(this instanceof SubClass)) {
subClassField = new SubClass();
}
}
}
但是,当然,仅仅因为你可以这样做并不是说你应该。虽然我可以想象一些可能是有效方法的场景,但它们将是“古怪的”情况。