如何强制所有子级重写父级的Clone()方法?
如何确保所有派生的C ++ / CLI类将覆盖基类的ICloneable :: Clone()方法?
我们认为我应该为此担心吗?还是这不是基层作家的责任?
修订:对不起,我忘了提到基类是非抽象类。
解决方案
回答
声明Clone()方法为抽象方法。即使父类确实具有具体的实现,这也应该起作用。
当然,强制执行此类操作的风险是派生类的编写者会感到恼火,说"无论如何我都不会使用Clone",并且会执行类似字节复制或者"返回此操作"的操作摆脱错误。
回答
在基类中将其声明为纯虚拟的。
班级基础
{
...
虚空Clone()= 0;
};
回答
好吧,我不能说这是否是基类的责任,在这里也不会陷入基于继承的合同的危险之中。
在任何情况下,我们都可以强制某个类重写方法" Clone()",例如,使其成为抽象类的纯虚拟成员。
public ref class ClonableBase abstract { public: virtual void Clone() = 0; }
注意"摘要"和" = 0;"。抽象允许类包含纯虚拟成员而没有警告,并且= 0;表示此方法是纯虚拟方法,即它不包含主体。请注意,我们不能实例化一个抽象类。
现在你可以
public ref class ClonableChild : public ClonableBase { public: virtual void Clone(); } void ConableChild::Clone() { //some stuff here }
如果在ClonableChild中没有Clone覆盖,则会出现编译器错误。
回答
Thomas是正确的,但是使类抽象的一种方法是定义一个纯虚方法。
可以这样说:
虚拟虚空Clone()= 0;
除非派生类实现Clone,否则它们将无法实例化它,因此,如果他们希望自己的类有用,他们将别无选择。
回答
class Base { ... virtual void Clone() = 0; };
是正确的。
如果我们想要克隆的某些默认行为,请尝试:
class Base { ... virtual void Clone() { ... doClone(); ... }; ... private: virtual void doClone() = 0; };
回答
Amendment: Sorry, I forgot to mention that the base class is a non-abstract class.
从这个新角度来看,我非常确定我们根本不想强迫任何人重写Clone()。例如,如果我的派生类未添加任何字段,则可能不需要其自己的专用Clone()方法。
回答
如果基类是非抽象的,则没有办法在编译时强制其被覆盖。我们可能可以做的最好的事情是:
virtual void Clone() { throw gcnew NotSupportedException(); }
这样,派生类将不得不重写该方法,否则应用程序将遇到NotSupportedException。至少这将在测试期间立即使我们发现某些错误。它会给我们寻找的东西,以便我们在遇到未正确覆盖Clone的类时知道。根据对派生类的控制程度,这对于鲁棒性可能很重要。
回答
经过深思熟虑,我发现了以下解决方案:
Object^ BaseClass::Clone() { if(this->GetType() != BaseClass::typeid) { throw gcnew System::NotImplementedException("The Clone() method is not implemented for " + this->GetType()->ToString() + "!"); } BaseClass^ base = gcnew BaseClass(); ... // Copy the fields here return base; }
如果我们尝试克隆尚未覆盖基类的Clone()方法的派生类的实例,则它将引发NotImplementedException。
回答
读这本草书。这正是你要的