2013-01-02 140 views
1

我創建與類的構造函數關於調用德爾福

TStaticDynSettings = class 
public 
    class constructor create; 
    class destructor destroy; 
    class procedure Reload; 
end; 

一類的靜態類不同的方式做所有其他方法的類除了創建和銷燬需要是一個類的方法呢?

我知道肯定所有的變量需要是一個類var否則自動初始化將無法正常工作。 ?

就是在調用程序的區別..

var StDyn : TStaticDynSettings;` 
StDyn.Reload; 

TStaticDynSettings.Reload;

+0

我們中的一個人誤解了使用類構造函數和析構函數施加於類的限制。我看到[沒有任何文檔](http://docwiki.embarcadero.com/RADStudio/XE3/en/Methods#Class_Constructors)這樣的類不能有實例字段或虛擬方法。你從哪裏讀到這樣的事情是不允許的?如果我懷疑這些特徵*是被允​​許的,那麼你的問題究竟有什麼意義? –

回答

3

1 - 如果你不打算創建TStaticDynSettings對象實例,你可以使用任何3種形式:

type 
    TStaticDynSettings = class 
    public 
    procedure Reload1; 
    class procedure Reload2; 
    class procedure Reload3; static; 
    end; 

call exa mples:

procedure Call1; 
var Instance: TStaticDynSettings; 

begin 
    Instance.Reload1; 
end; 

procedure Call2; 
begin 
    TStaticDynSettings.Reload2; 
end; 

procedure Call3; 
begin 
    TStaticDynSettings.Reload3; 
end; 

的區別在於Reload1Reload2方法過去了,在Reload3沒有通過一個隱藏的參數。

隱藏的參數是Reload1到對象實例的引用(而不是使用,因爲沒有創建對象實例),並在Reload2類引用(這可能也沒有必要在你的情況下,假設類引用在被稱爲編譯時間)。

第一種形式(Reload1)是誤導性的,因爲它假設使用對象的參考,因此應避免(雖然它的工作原理)。

第三種形式(Reload3)如果你不使用類引用是在編譯時未知的是優選的。

2 - 沒有區別(如果第一種情況,則不計算使用不必要的對象變量的開銷)。

+0

我覺得你實際上並沒有回答第一個問題。或者,通過暗示'Reload1'是一個有效的選擇,你的意思是隱含地回答這個問題* no *嗎?我不認爲你應該推薦聲明實例方法,這些方法打算在無效的實例引用上被調用。 –

+0

您好serg我dint得到你的意思reload3如何在編譯時引用類將不明。只有當我們使用VMT(polymorhism)時,它在編譯時是未知的,但是我們不能在包含類構造函數的類中使用VMT。你能詳細解釋一下嗎? – SreeRaghavan

+0

@SreeRaghavan - 這是一個不同的故事;你可以聲明一個類過程(例如'Reload2')爲虛擬的,所以我想有一些vtable負責它。 – kludg