我有一个类,它有子类,我想要正确处理复制对象。名为Item的超类有一个复制构造函数,子类也有自己的复制构造函数。但是,我想知道的是如何使它以下工作。
Item
课程(简要说明)
构造
public Item(...) {
}
复制构造函数:
public Item( Item template ) {
}
子类是Weapon,Armor,Shield等等。
我想做的是能够说:
Weapon weapon = new Item( weapon );
如果武器是Weapon
并且调用了正确的复制构造函数(属于特定的子类),则返回类型为Weapon
的新对象,而不是仅仅返回一个新{{1}仅包含属于武器的Item
部分。这样做的最佳和/或正确方法是什么?
答案 0 :(得分:2)
由于您的复制构造函数只与子类交互,因此您应该在父类中使用复制构造函数的抽象方法,然后在子类中定义复制构造函数
答案 1 :(得分:1)
首先,如果Weapon
是Item
的子类,则以下行永远不会编译。
Weapon weapon = new Item( weapon );
您可以在static copy()
类中使用Item
方法,而不是使用构造函数。使用下面的示例,每个子类必须声明自己的私有拷贝构造函数。这些构造函数对外界不可见。因此,复制Item
的唯一方法是Item#copy()
。
<强> Item.java 强>
public class Item {
public String name;
public Item(String name) {
this.name = name;
}
private Item(Item template){
this(template.name);
}
public static Item copy(Item template) {
try {
Class<? extends Item> clazz = template.getClass();
Constructor<? extends Item> constructor = clazz.getDeclaredConstructor(clazz);
constructor.setAccessible(true);
return constructor.newInstance(template);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
<强> Weapon.java 强>
public class Weapon extends Item {
double damage = 50.4;
public Weapon(String name, double weight) {
super(name);
this.damage = weight;
}
private Weapon(Weapon template) {
this(template.name, template.damage);
}
}