在Java中为派生类实例提供基类实例

时间:2013-06-10 22:44:03

标签: java inheritance

我有这种情况

class Parent {
    int data;
    public Parent(int data) {
        this.data = data;
    }
}

class Child extends Parent {
    int childData;
    public Child(int data, int childData) {
        super(data);
        this.childData = childData;
    }
}

我手边有一个Parent的实例。我想为其添加childData功能。我最近在Javascript中编程,这是微不足道的,我精神上移植了设计模式,却没有意识到这在Java中是非常重要的。

假设我完全控制Child类代码,那么最佳做法是什么?我可以不克隆吗?是否有必要修改Parent类以使其起作用?

当然在最差的情况下(这听起来很糟糕)有这个解决方案:

new Child(parent.data, childData);

由于Parent的数据都是公开的。

具体问题(我倾向于忘记包含在Java问题中)是我有一个返回用户的Config.testUser方法,我想为它添加一个数据,使其成为InitialScanUserUser添加了initialScanAlgorithm InitialScanAlgorithm个数据类型Config.testUserInitialScanAlgorithm生活在一个不能依赖{{1}}的包中。

2 个答案:

答案 0 :(得分:0)

使Parent个实例不可变,您只需委托给Parent的实例。

请参阅Effective Java, Item 16: Favor composition over inheritance.

答案 1 :(得分:0)

这不是微不足道的。无法更改实例类(尽管它可以引用作为超类引用,但实例本身不能更改)。

更优雅的方式是(如果你经常使用构造)添加一个接受父实例的构造函数。

public Child(Parent parent, int childData) {
  ....
}