【问题标题】:Sub class instance variable in super-class object?超类对象中的子类实例变量?
【发布时间】:2013-07-24 03:29:43
【问题描述】:

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

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

也就是说,这是行不通的:

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

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

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

【问题讨论】:

    标签: loops inheritance constructor


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 2016-06-13
        • 2015-10-07
        • 1970-01-01
        • 2015-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多