2009-05-19 58 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类型的对象时,您永远不知道要获得什么这使得接口无用“(重点是我的)