2

我有一个继承了两次的基地。第二个子类没有为方法克隆提供任何签名,但第三个子类提供并定义方法克隆如下。

  TControlObject = abstract class
  ...
  public
    method Clone:TControlObject; virtual; abstract;
  end;

  TGateControl = class(TControlObject)
  ...
  public
  ...
  end;

  TAndControl = class(TGateControl)
  public
    method Clone:TControlObject; override;
  end;

但是,编译器会引发错误,即 TGateControl 类不提供克隆方法的实现。由于 TGateControl 是从 TControlObject 继承的,而 TAndControl 类是从 TGateControl 继承的,因此应该自动为基类 clone 方法覆盖方法 clone。我对吗?

提前致谢,

4

1 回答 1

4

您在abstract中具有 Clone 方法的属性TControlObject。这意味着任何直接派生自的类都TControlObject必须提供 Clone 方法的实现(请参阅MSDN 摘要)。因此,TGateControl 必须提供克隆的实现。如果TControlObject有克隆的具体实现,是的,它不需要被覆盖。

所以一些选择是:

  1. 删除abstract克隆上的属性。
  2. CloneTControlObject或中添加一个实现TGateControl

澄清一下,这些方法永远不会“自动覆盖”。派生类能够调用基类的实现,但是说派生类“自动覆盖”了基类的实现是不正确的。

于 2012-08-09T15:56:37.953 回答