如何确保所有派生的C ++ / CLI类都将覆盖基类的ICloneable :: Clone()方法?

您认为我应该为此担心吗? 还是这不是基层作家的责任?

修订:对不起,我忘了提到基类是非抽象类。

===============>>#1 票数:2

在基类中将其声明为纯虚拟的。

班级基础
{
...
虚空Clone()= 0;
};

===============>>#2 票数:2

好吧,我不能说这是否是基类的责任,在这里也不会陷入基于继承的合同的危险中。

在任何情况下,您都可以通过使其成为抽象类的纯虚拟成员, 强制某个类重写方法-例如“ 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覆盖,则会出现编译器错误。

===============>>#3 票数:1

声明Clone()方法为抽象方法。 即使父类确实具有具体的实现,这也应该起作用。

当然,强制执行此类操作的风险是派生类的编写者会感到恼火,说“无论如何我都不会使用Clone”,并且会执行类似字节复制,甚至“返回此操作”的操作,摆脱错误。

===============>>#4 票数:1

如果基类是非抽象的,则没有办法在编译时强制其被覆盖。 您可能能做的最好的事情是:

virtual void Clone()
{
   throw gcnew NotSupportedException();
}

这样,派生类将不得不重写该方法,否则您的应用程序将遇到NotSupportedException。 这至少会使在测试过程中立即发现某些错误。 它会给您寻找的东西,以便您在遇到未正确覆盖Clone的类时知道。 根据对派生类的控制程度,这对于鲁棒性可能很重要。

===============>>#5 票数:0

class Base
{
...
virtual void Clone() = 0;
};

是正确的。

如果您想要克隆的某些默认行为,请尝试:

class Base
{
...
virtual void Clone()
{ 
   ...
   doClone();
   ...
};

...

private:
virtual void doClone() = 0;
};

===============>>#6 票数:0

修订:对不起,我忘了提到基类是非抽象类。

从这个新角度来看,我很确定您根本不想强迫任何人重写Clone()。 例如,如果我的派生类未添加任何字段,则它可能不需要其自己的专用Clone()方法。

===============>>#7 票数:0

经过深思熟虑,我发现了以下解决方案:

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。

===============>>#8 票数:0

这本草书。 这正是你要的

===============>>#9 票数:-1

Thomas是正确的,但是使类抽象的一种方法是定义一个纯虚方法。

可以这样说:

虚拟虚空Clone()= 0;

除非派生类实现Clone,否则它们将无法实例化它,因此,如果他们希望自己的类有用,他们将别无选择。

  ask by metamal translate from so

未解决问题?本站智能推荐:

1回复

在.NET c ++中,子窗体调用父级的函数

我正在申请2个winforms:Form1.h和TrackEdit.h。 它们都在同一名称空间中(“ParkCleanUp2”)。 从Form1中我调用此代码: 它给我这些错误: 但是,如果我去TrackEdit.h它会告诉我: 所以我想知道为什么它给我错误“ '
2回复

C ++ / CLI中未来事件的毫秒级精确调度

我需要创建一个C ++ / CLI混合程序集,该程序集可以将未来的调用安排到毫秒级的本机DLL中。 当然,这意味着要预先设置一个计时器( 哪种类型 )一毫秒或三毫秒,然后旋转直到此刻并调用本机DLL函数。 根据我所读的内容,我猜测计时器调用的回调将需要是本机的,以确保没有thunk或
1回复

如何使用C ++ / CLI调用重写的基类方法

实现此C#代码的正确方法是什么: 在C ++ / CLI中
1回复

对具有重写属性的重载函数的歧义调用

我有两个基本接口 然后有几个实现IEntity的实体。 这些实体在C#和C ++ / Cli中均被使用。 直到我搬到VS2015之前,一切都很好。 现在,当我尝试使用C ++访问ID时 我收到以下错误: 我可以通过将代码更改为 但这是转换所有现有代
1回复

在Visual C ++中从子窗口返回到父窗口

我在Visual c ++中使用winForm构建程序。 单击按钮后,我需要从第一个窗口移至另一个窗口。 为此,我使用下面的代码,它工作正常。 但是,我需要在子窗口上单击一个后退按钮,单击该按钮将隐藏/禁用它并显示父窗口。 我怎样才能做到这一点?
2回复

键枚举,不返回所有标点符号的ASCII等效项

我有以下密钥处理程序: 这会适当地处理数字和字母,但是当我按下任何标点符号时,KeyCodes完全是精神上的。 使用signed char我得到-66为'。' 和190用unsigned char 。 我认为这必定是由于我与Windows搞砸了,请有人提供一种更好的方法来处理F
1回复

使用.NET Framework生成数字签名的方法

除了这个之外,在.NET Framework中使用私钥(在智能卡上,安装在本地证书库中的证书)创建数字签名的另一种方法是什么,因为我不知道如何找到密钥容器名称(似乎没有其他人这样做)? 我理解它的方式,如果一个初始化没有keyContainerName的CspParameters,Cry
1回复

C ++ / CLI方法中的内存泄漏

我在代码中找到了此调用的内存泄漏: VideoPlayer是一个C ++ / CLI库,此方法的代码为: 和ToWriteableBitmap: 当我在windbg中运行!threads时,多次调用此方法会导致某些对象被“固定”,并且DeadThread计数很高。 在这
3回复

托管C ++ / CLI方法中的可选参数

在C#中使用时,如何在C ++ / CLI中声明具有可选参数的托管方法? 我使用Optional和DefaultParameterValue属性修饰了参数(请参阅: 如何编码默认参数值 ),但只有Optional属性才被尊重。 C ++ / CLI: C#: 输出
4回复

是否可以在汇编中扫描具有特定属性的方法?

是否可以扫描装配中具有特定属性的方法? 我目前正在开发Visual C ++项目,但即使C#对我来说还不错。 我需要找到当前具有特定属性Eg的所有方法。 [XYZ]适用于它。 有什么想法吗?