2014-03-12 63 views
2

我有一个类,它有我想正确处理复制对象的子类。名为Item的超类有一个拷贝构造函数,子类也有它们自己的。但是,我想知道的是如何使它成为下面的工作。复制构造函数和多态性

Item类(简化的描述)

构造:

public Item(...) { 
} 

拷贝构造:

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

的子类之类的东西武器,盔甲,盾牌等

我想要做的是能说:

Weapon weapon = new Item(weapon); 

哪里武器是Weapon和正确的复制调用构造函数(属于特定的子类),返回一个新的对象类型Weapon,而不是仅返回一个新的Item只有属于武器的Item部分。什么是最好的和/或正确的方式来做到这一点?

+2

你可能想要一个[工厂模式](http://en.wikipedia.org/wiki/Factory_method_pattern) 。虽然在你的情况下,我不确定具有多态构造函数的好处是什么,因为你正在与子类“Weapon”而不是基类“Item”进行交互。如果你知道你正在获得'Weapon',只需调用'Weapon()'。 – aruisdante

+0

你可能是对的工厂模式的事情。我有一个单独的方法在其他地方从模板项创建项目,我想推广它,而不是为每个子项的单独的方法,我现在必须,因为类有单独的复制构造函数。 –

回答

2

由于您的拷贝构造函数将只子类进行交互,你应该有抽象方法在父类的拷贝构造函数,然后在子类中定义的拷贝构造函数

+0

尽管听起来不错,但Item类不是抽象类,也没有任何东西阻止您制作Item。这可能是一个设计缺陷问题,但Item覆盖了没有特定子类的任何类型的Item。所以,考虑到这一点,我可能只想复制一个普通的Item,因此父级中的抽象拷贝构造函数不起作用。 –

+0

是否有可能修改您的设计,以便没有特定子类的项目可以有一个共同的子类?这样它将成为一个更清洁的实施。 – Manali

+0

抽象类在java中不能有抽象构造函数。 – zudduz

1

首先,以下行也不能编译,如果WeaponItem的一个子类。

Weapon weapon = new Item(weapon); 

而不是使用一个构造函数,你可以在Item类使用static copy()方法。使用下面的例子,每个子类必须声明它自己的私有拷贝构造函数。这些构造函数对外界不可见。因此,复制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); 
    } 
}