2008-12-23 58 views
4

在Delphi中可能有一個類方法調用具有相同名稱的繼承實例方法嗎?例如,我想是這樣的:在德爾福,我可以調用一個類方法同名的實例方法嗎?

//... Skipped surrounding class definitions 

function TSomeAbstractDialogForm.Execute: Boolean; 
begin 
    Result := ShowModal = mrOk; 
end; 

我有一對夫婦的是繼承了抽象的對話形式專門對話框類,每一類都有自己的工廠方法:

class function TSomeInheritingDialogForm.Execute: Boolean; 
var 
    Fm: TSomeInheritingDialogForm; 
begin 
    Fm := TSomeInheritingDialogForm.Create(nil); 
    try 
    Result := Fm.Execute; 
    finally 
    Fm.Free; 
    end 
end; 

這種做法導致在從F.Execute開始的永無止境的循環中,不是調用基類的預期實例方法,而是一遍又一遍地調用工廠方法(產生一堆創建的表單)。

當然,顯而易見的解決方案是更改工廠方法的名稱(我將其命名爲CreateAndShow),但它讓我感到好奇。編譯器怎麼沒有警告我隱藏的方法?有沒有一種方法可以在這種情況下顯式調用實例方法?

回答

5

您可以嘗試硬演員。但重命名類函數會更好。 (例如CreateAndExecute)。

子類中的執行隱藏父類中的執行(我認爲編譯器會給出警告)。你可以用硬性演員來訪問它。但是沒有辦法區分實例方法和類方法。

function TSomeAbstractDialogForm.Execute: Boolean; 
begin 
    Result := ShowModal = mrOk; 
end; 

class function TSomeInheritingDialogForm.Execute: Boolean; 
var 
    Fm: TSomeInheritingDialogForm; 
begin 
    Fm := TSomeInheritingDialogForm.Create(nil); 
    try 
    Result := TSomeAbstractDialogForm(Fm).Execute; 
    finally 
    Fm.Free; 
    end 
end; 
+0

啊,當然,投給基地班。明顯。爲什麼我沒有想到這個? :-) 編譯器沒有警告我,我發現有點奇怪。 Delphi似乎錯過了隱藏實例方法的類方法的特例。 – 2008-12-23 16:37:38

0

豈不

Result := inherited Execute; 

做的伎倆?

+0

你的意思是這樣的「結果:=繼承Fm.Execute;」或者是「結果:= FM.inherited執行;」?無論如何,似乎太混亂,恕我直言。 – 2008-12-23 17:19:26

1

結果:=繼承執行不會這樣做,因爲它在創建的變量上調用,而不是在類方法中調用。

問題是,具有相同名稱的類函數和靜態方法是一個壞主意。編譯器將它們視爲兩個獨立的世界,可以彼此相鄰。

相關問題