2012-02-01 21 views
17

考慮假想對象層次,首先是:德爾福:方法「創建」隱藏基地的虛方法 - 但它是正確的有

TFruit = class(TObject) 
public 
    constructor Create(Color: TColor); virtual; 
end; 

及其後代:

TApple = class(TFruit) 
public 
    constructor Create(); overload; virtual; 
    constructor Create(Color: TColor); overload; override; //deprecated. Calls other constructor - maintaining the virtual constructor chain 
end; 

的想法在這裏我已經覆蓋虛擬基類的構造函數,與過載也碰巧是虛擬的。

德爾福抱怨:

方法「創建」隱藏了基類型的虛擬方法TFruit「

除了它並不能掩蓋它 - 它就在那裏!

  • 壓倒在祖先的虛方法,並
  • 超載它與其他版本

這是怎麼回事?

+1

我得到「方法‘創建’隱藏了基類型‘TFruit’的虛方法」;你真的得到「基礎型」TApple'「嗎? – hvd 2012-02-01 21:09:38

+0

@RBA在這種情況下,警告不正確,儘管您可以使用'reintroduce;'來避免它。 – hvd 2012-02-01 21:12:53

+0

這是特定於Delphi 5嗎? – EMBarbosa 2012-02-02 00:33:23

回答

24

兩個解決方案:

type 
    TFruit = class(TObject) 
    public 
    constructor Create(Color: TColor); virtual; 
    end; 

    TApple = class(TFruit) 
    public 
    constructor Create(); reintroduce; overload; 
    constructor Create(Color: TColor); overload; override; 
    end; 

或者:

type 
    TFruit = class(TObject) 
    public 
    constructor Create; overload; virtual; abstract; 
    constructor Create(Color: TColor); overload; virtual; 
    end; 

    TApple = class(TFruit) 
    public 
    constructor Create(); override; 
    constructor Create(Color: TColor); override; 
    end; 
+3

+1。我無法找到使XE2的編譯器很開心的'overload','virtual'和/或'override'的組合。 :) – 2012-02-01 21:21:01

+2

恕我直言,如果你需要重新引入,你的代碼聞起來很可怕。 – 2012-02-02 15:53:56

+0

@WarrenP這種氣味來自「reintroduce」的其他用途,常常破壞繼承。 – NGLN 2012-02-02 18:21:34

5

這似乎是一個 「這是先」 之類的問題。 (看起來NGLN找到了解決方案。)

還有另一種解決方案。您可以使用默認參數:

interface 

type 
    TFruit=class(TObject) 
    public 
    constructor Create(Color: TColor); virtual; 
    end; 

    TApple=class(TFruit) 
    public 
    constructor Create(Color: TColor = clRed); override; 
    end; 

implementation 

{ TFruit } 

constructor TFruit.Create(Color: TColor); 
begin 
    inherited Create; 
end; 

{ TApple } 

constructor TApple.Create(Color: TColor); 
begin 
    inherited; 
end; 

// Test code 
var 
    AppleOne, AppleTwo: TApple; 
begin 
    AppleOne := TApple.Create; 
    AppleTwo := TApple.Create(clGreen); 
end; 
+1

+1創造力。但不需要重新引入,我會使用'clDefault'。 ;) – NGLN 2012-02-01 21:27:20

+0

謝謝。 :) 你是對的。我認爲這是以前的一個試驗的遺留問題,編譯器沒有抱怨,所以我沒有抓住它。我從來沒有見過一個'clDefault'彩色蘋果。 ;) – 2012-02-01 21:31:54

+0

我沒有提到它爲蘋果着色,但要堅持問題的目的是在TApple中添加無參數的構造函數。很明顯OP認爲有蘋果沒有任何顏色。 ;)另外,clDefault是什麼顏色?這是蘋果的默認顏色,不是嗎? (好吧,它實現爲黑色,但這是因爲TColor只需要一些整數值)。 – NGLN 2012-02-01 21:44:01

相關問題