2009-05-19 56 views
0

下面的方法對我的類Clone()實現:實施克隆()在基類

MyClass^ Clone(){ 
     return gcnew MyClass(this->member1, this->member2); 
    } 

現在,我擁有MyClass派生約10班。每種情況下的實現都是相同的。由於我需要在每種情況下調用gcnew以及實際的類名,因此我需要創建10個幾乎相同的Clone()實現。

有沒有辦法在基類中編寫一個單一的Clone()方法,它將服務於所有10個派生類?

編輯:有沒有辦法通過它的一個對象調用類的構造函數?以某種方式調用實際的派生類構造函數。例如:

MyClass ^obj2 = obj1->Class->Construct(arg1, arg2); 

我在C++/CLI上這樣做,但歡迎來自其他語言的答案。

回答

3

在普通的老C++中,你可以做是編譯時多態性(奇怪的循環模板模式)。假設你的派生類是可複製,你可以這樣寫:


class Base 
{ 
public: 
    virtual Base* Clone() const = 0; 
//etc. 
}; 
template <typename Derived> 
class BaseHelper: public Base 
{ 
    //other base code here 

    //This is a covariant return type, allowed in standard C++ 
    Derived * Clone() const 
    { 
     return new Derived(static_cast<Derived *>(*this)); 
    } 
}; 

然後使用它像:


class MyClass: public BaseHelper<MyClass> 
{ 
    //MyClass automatically gets a Clone method with the right signature 
}; 

請注意,你不能從一個類派生再次並讓它無縫工作 - 你有以「設計」選項,通過模板化中間類再次派生,或者再次開始重寫Clone

0

不是我知道的C++。正如你所說的,你需要在每個Clone()的實現中創建一個不同類的對象。

0

嗯,我想你可以在這裏使用工廠模式。 I .: .:

MyClass Clone(){ 
    return MyClassFactory.createInstance(this.getClass(), this.member1, this.member2, ...); 
} 

在工廠,你將不得不根據傳遞的類類型創建子類的實例。所以可能它與你的方法有相同的缺點。

0

我會建議使用複製構造函數(因爲派生類也可以調用基本實現的複製構造函數) - 同樣方便,因爲它對於C++程序員來說將是熟悉的領域。

您可能可以創建一個使用反射在本例中調用自身拷貝構造函數的Clone方法。

也許值得注意的是,Jeffrey Richter在框架設計指南書中說:「ICloneable接口是一個非常簡單的抽象例子,它有一個從未明確記錄過的契約,有些類型實現了這個接口的Clone方法,執行該對象的淺表副本,而某些實現執行深度複製。因爲此接口的Clone方法應該執行的操作從未完全記錄,因此在使用實現了ICloneable類型的對象時,您永遠不知道要獲得什麼這使得接口無用「(重點是我的)