2012-08-09 85 views
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继承,因此应该自动为基类克隆方法重写方法克隆。我对吗?

由于提前,

+1

你的代码中的TMakerObject应该是TControlObject吗?如果不是,为什么您要为TMakerObject提供类签名? – 2012-08-09 15:54:39

+0

是的,犯了一个错误。这是当你开始复制和粘贴LOL – ThN 2012-08-09 16:01:31

回答

4

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

所以有些选项是:

  1. 要么取消对克隆abstract属性。
  2. TControlObjectTGateControl中添加Clone的实现。

并且为了澄清,这些方法从未被“自动覆盖”。派生类可以调用基类的实现,但是说派生类具有“自动重写”基类的实现是不正确的。

+0

+1时发生的情况。你的回答比我的要清楚得多。删除了我的。 – 2012-08-09 16:09:11