超类对象中的子类实例变量?

时间:2013-07-24 03:29:43

标签: loops inheritance constructor

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

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

也就是说,这不起作用:

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

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

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

2 个答案:

答案 0 :(得分:2)

这通常是一个坏主意。如果你的超类需要一个子类的实例,那就是代码味道。它创建了循环依赖关系并建议破坏分析。

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

答案 1 :(得分:0)

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

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

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

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