2012-08-09 84 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