1

假设我有两个名为“SuperClass”和 SubClass 的类。子类扩展超类。

我刚刚发现 SuperClass 不可能有 SubClass 类型的实例变量。

也就是说,这不起作用:

class SuperClass{
     SubClass x = new SubClass();
}

因为它导致构造函数相互调用,进入一个永久循环。(因为 Java 会自动调用 Super())

创建子类实例变量是不可能的并且是一个糟糕的设计理念吗?还是有某种解决方法?

4

2 回答 2

2

这通常是一个坏主意。如果您的超类需要子类的实例,那就是代码异味。它会创建循环依赖关系并建议进行损坏的分析。

解决方法/修复通常是将超类使用的任何代码从子类引入超类。

于 2013-07-24T03:47:35.333 回答
0

唯一的限制是在超类构造函数中放置子类(或者,就此而言,超类的另一个实例)的分配。您当然可以拥有一个具有子类类型的实例字段,并在构造超类后的某个时间点设置它。(尽管您显然需要通过 setter 方法防止任何递归。)

实际上,如果构造函数中有条件逻辑可以在构造子类时跳过分配,则可以将分配放在超类构造函数中。例如:

class SuperClass {
    SubClass subClassField;
    SuperClass() {
        if (!(this instanceof SubClass)) {
            subClassField = new SubClass();
        }
    }
}

但是,当然,仅仅因为你做到这一点并不意味着你应该这样做。虽然我可以想象一些可能是有效方法的场景,但它们将是“奇怪”的情况。

于 2013-08-05T11:16:32.367 回答