超类是否可以具有子类类型的实例变量?

时间:2015-07-18 03:28:27

标签: java oop inheritance

例如,

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

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

如果我理解正确,Subfolder将继承Folder超类的所有字段,包括其List<Subfolder>。但是,因为该列表对Folder是私有的,并且只要我没有为列表编写任何访问器或mutator方法,我可以放心,Subfolder将无法执行任何操作使用Folder的子文件夹列表。我感到矛盾的是这是否被认为是好的设计。如果Subfolder无法访问Folder的子文件夹列表,为什么要继承它?

3 个答案:

答案 0 :(得分:1)

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

你有一个很高的耦合,这是不好的,因为你正在使文件夹依赖于它的孩子。

答案 1 :(得分:1)

  • Abstraction

    一种可能性是abstract Folder,它可能会将其未实现的行为委托给SubFolder个实例。我请参阅并要求SubFolder必须是Folder与编译Folder相对的实例。

  • 封装

    不继承private字段,因为该字段不可直接访问(它是封装的)。可变性通常需要线程之间的同步(或类似Copy-On-Write)。无论如何,维基百科说encapsulation 用于隐藏类中结构化数据对象的值或状态,防止未授权方直接访问它们 。 / p>

答案 2 :(得分:0)

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

  

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

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