如何强制所有子级重写父级的Clone()方法?

时间:2020-03-05 18:57:43  来源:igfitidea点击:

如何确保所有派生的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。

回答

读这本草书。这正是你要的