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