在基类中实现Clone()方法

时间:2009-05-19 12:05:33

标签: oop constructor clone platform-agnostic

这是我班级的Clone()实施:

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

现在我有大约10个来自MyClass的类。每种情况下的实施都是相同的。由于我需要在每种情况下使用实际的类名称调用gcnew,因此我需要创建10个几乎相同的Clone()实现。

有没有办法在基类中编写一个单Clone()个方法,它将为所有10个派生类提供服务?

编辑:有没有办法通过其中一个对象调用类的构造函数?以某种方式调用实际的派生类构造函数。类似的东西:

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

我在C ++ / CLI上这样做,但欢迎来自其他语言的答案。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我不知道在C ++中。如您所说,您需要在Clone()的每个实现中创建不同类的对象。

答案 2 :(得分:0)

嗯,我想你可以在这里使用工厂模式。即:

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

在工厂中,您必须根据传递的类类型创建子类的实例。所以它可能与你的方法有相同的缺点。

答案 3 :(得分:0)

我建议使用复制构造函数(因为派生类也可以调用基本实现的复制构造函数) - 也很方便,因为它将成为C ++程序员熟悉的领域。

您可以在此实例中创建一个使用反射来调用复制构造函数的Clone方法。

可能还值得注意的是Jeffrey Richter在“框架设计指南”一书中说过,“ICloneable接口是一个非常简单的抽象示例,其合同从未明确记录过。有些类型实现了此接口的Clone方法因此它执行对象的浅表副本,而某些实现执行深层复制。因为当使用具有实现Clone类型的对象时,此接口的ICloneable方法应该做什么从未完全记录,你永远不会知道你会得到什么。这使界面无用“(强调我的)