这有效:
class ABean implements A {
protected String field1;
...
protected String fieldn;
public String getField1() {
return field1;
}
...
}
class BBean extends ABean {
public BBean(A a) {
super();
this.field1=a.getField1();
...
this.fieldn=a.getFieldn();
}
}
但是编写这个构造函数B(A a)
很麻烦,不实用,而且容易出错,因为如果我在A
中添加或删除字段,那么我需要修改那个构造函数,有时可能会忘记初始化一些A
中的字段。
我想我可以为ABean实现clone,但是这会有类似的问题(因为当我添加/删除字段时需要更新克隆实现)并且这也不允许我拥有BBean(A a)
构造函数;只有BBean(ABean a)
构造函数,除非我也创建了接口的clone()
部分。
那么...... 是否有更清晰,更好的方式来实施BBean(A a)
?
答案 0 :(得分:1)
尝试使用合成,而不是使用继承。也就是说,让BBean extends ABean
拥有构造函数BBean
而不是BBean(ABean a)
。这样,您就可以避免在ABean
代码中构建新BBean
的所有细节。
答案 1 :(得分:0)
如何在ABean上实现“A”构造函数(copy-constructor),如下所示:
class ABean implements A {
protected String field1;
...
protected String fieldn;
public String getField1() {
return field1;
}
...
public ABean(A other) {
this.field1=other.getField1();
...
this.fieldn=other.getFieldn();
}
}
class BBean extends ABean {
public BBean(A a) {
super(a);
}
}
这样,A的“复制构造函数”映射就在您的ABean中。
答案 2 :(得分:0)
你可以使用反射:
class A {}
class B {
public B(A a) {
String methodName = null;
try {
Field[] fields = a.getClass().getDeclaredFields();
for (Field field : fields) {
methodName = field.getName().substring(0, 1).toUpperCase()
+ field.getName()
.substring(1, field.getName().length());
field.get(a);
this.getClass().getMethod("set" + methodName, field.getClass()).invoke(a, field.get(a));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}