【问题标题】:Can a superclass have an instance variable of a subclass type?超类可以有子类类型的实例变量吗?
【发布时间】:2015-10-07 20:43:06
【问题描述】:

例如,

public class Folder {
    // ...
    private List<Subfolder> subfolders;
}

public class Subfolder extends Folder {
    // ...
}

如果我理解正确,Subfolder 将继承 Folder 超类的所有字段,包括它的 List&lt;Subfolder&gt;。但是,因为列表是 Folder 私有的,并且只要我不为列表编写任何访问器或修改器方法,我可以放心 Subfolder 将无法对 Folder 做任何事情的子文件夹列表。我感到矛盾的是这是否被认为是好的设计。如果Subfolder 无法访问Folder 的子文件夹列表,为什么还要继承它?

【问题讨论】:

  • 您想要这种设计的原因是什么。你不能在 Folder 类中有一个文件夹列表吗?

标签: java oop inheritance


【解决方案1】:

子类从其父类继承非私有字段。你有一个糟糕的设计,因为父类不应该知道他们的子类。

您的耦合度很高,这很糟糕,因为您使 Folder 依赖于它的子级。

【讨论】:

  • 感谢您确认我的怀疑。然而,在 Herbert Schildt 的 Java: A Beginner's Guide 中,他说“即使子类包含其超类的所有成员,它也无法访问那些已被声明为私有的超类成员。”因此,除非我不了解某些技术,否则孩子确实继承了所有字段,包括私有字段,它只是无法访问它们。
【解决方案2】:
  • Abstraction

    一种可能性是abstractFolder,它可能会将未实现的行为委托给SubFolder 实例。我看到没有要求SubFolder 必须是Folder 的实例,而不是编译Folder

  • 封装

    private 字段未继承,因为该字段不可直接访问(已封装)。可变性通常需要线程之间的同步(或类似 Copy-On-Write 的东西)。不管怎样,维基百科说encapsulation用于隐藏类内结构化数据对象的值或状态,防止未经授权的各方直接访问它们

【讨论】:

    【解决方案3】:

    没有,因为 OOP 遵循严格的层次结构。来自this

    这样想,所有的狗都是动物,但不是所有的动物都是 小狗。所有的狗都会吠叫,但并非所有的动物都会吠叫。

    您不能让超类调用子类方法,因为超类从子类继承任何东西。

    【讨论】:

      猜你喜欢
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多