我有这种情况
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
方法,我想为它添加一个数据,使其成为InitialScanUser
,User
添加了initialScanAlgorithm
InitialScanAlgorithm
个数据类型Config.testUser
。 InitialScanAlgorithm
生活在一个不能依赖{{1}}的包中。
答案 0 :(得分:0)
使Parent
个实例不可变,您只需委托给Parent
的实例。
请参阅Effective Java, Item 16: Favor composition over inheritance.
答案 1 :(得分:0)
这不是微不足道的。无法更改实例类(尽管它可以引用作为超类引用,但实例本身不能更改)。
更优雅的方式是(如果你经常使用构造)添加一个接受父实例的构造函数。
public Child(Parent parent, int childData) {
....
}