2014-03-12 60 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); 
    } 
}