2014-12-24 131 views
1

我想創建一個包含另一個對象的超類的對象的副本。在這個例子中,我想複製包含ToyBox。但是,所有類型的玩具都可以放在箱子裏。在Toy中創建複製構造函數的最佳方法是什麼?複製一個包含另一個對象的超類的對象

​​

我真的不知道如何解決這個問題。

回答

6

品牌Toy有一個抽象方法copy()返回類型Toy。那麼您將被迫在CarPuppet中覆蓋此項。在Box的複製構造函數中,您可以使用box.getToy().copy()

+0

爲什麼要爲此創建特定的方法? 'Object.clone'已經有了這個語義 – Dici

+1

你可以使用'clone()'。我寧願避免它,但因爲它是一團糟('Cloneable'沒有'clone'方法等)。 –

+0

我認爲使用Cloneable是完全安全的。請參閱文檔:http://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html – Dici

1

您可以覆蓋每個Toy的子類的clone方法,然後:

public Box(Box box) { 
    this.toy = (Toy) box.getToy().clone(); 
} 

或者,如果你有一個類型玩具的常數,您可以使用,而不是一類的枚舉。

0

我認爲這個結構可以幫助你有一個想法,在這種情況下,我們將一個使用Box構造函數的對象玩具傳遞給超類(玩具類),並且在玩具類中我們有一個構造函數來接受來自玩具類的對象,初始化玩具對象的getInstance方法(僅舉例)。

class Box extends Toy 
{ 
    public Box(Toy toy) 
    { 
    super(toy); 
    } 
} 
Class Toy 
{ 
    private static Toy toys = new Toy(); 
    Toy(){} 
    Toy(Toy toy) 
    { 
     toy = Toy.getInstance(); 
    } 
    public static Toy getInstance() 
    { 
    return toys; 
    } 
} 

,要麼,如果你不希望其他類(子類)看不到規定的方法和屬性,只是讓他們私人的,如果你想子類都不能訪問設置和也獲得方法,使他們只有私人!

相關問題