复制构造函数和多态性

时间:2014-03-12 19:48:23

标签: java constructor copy-constructor

我有一个类,它有子类,我想要正确处理复制对象。名为Item的超类有一个复制构造函数,子类也有自己的复制构造函数。但是,我想知道的是如何使它以下工作。

Item课程(简要说明)

构造

public Item(...) {
}

复制构造函数:

public Item( Item template ) {
}
  • 在这方面每个子类的基本布局是相同的,除了它们只是使用不同的构造函数创建一个新的项目实例,用于从存储在文本文件中的数据创建一个新对象(从中传递数据)模板对象)然后从模板对象中填入其他字段。

子类是Weapon,Armor,Shield等等。

我想做的是能够说:

Weapon weapon = new Item( weapon );

如果武器是Weapon并且调用了正确的复制构造函数(属于特定的子类),则返回类型为Weapon的新对象,而不是仅仅返回一个新{{1}仅包含属于武器的Item部分。这样做的最佳和/或正确方法是什么?

2 个答案:

答案 0 :(得分:2)

由于您的复制构造函数只与子类交互,因此您应该在父类中使用复制构造函数的抽象方法,然后在子类中定义复制构造函数

答案 1 :(得分:1)

首先,如果WeaponItem的子类,则以下行永远不会编译。

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);
    }
}