这是我班级的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上这样做,但欢迎来自其他语言的答案。
答案 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
方法应该做什么从未完全记录,你永远不会知道你会得到什么。这使界面无用“(强调我的)