2010-06-18 42 views
4

我剛纔看到下面的代碼,但我不明白構造函數聲明中基類右派的派生。這是什麼,這是可能的順序方法?在構造函數中使用繼承(publix X():y)

public SplashAppContext(Form mainForm, Form splashForm) : base(splashForm) 
{ 
this.mainForm = mainForm; 
splashTimer.Tick += new EventHandler(SplashTimeUp); 
splashTimer.Interval = 2000; 
splashTimer.Enabled = true; 
} 

回答

8

它調用基類構造函數,傳遞型Form的說法splashForm它。

您也可以調用基類方法。例如,如果你已經重寫了一個你想要稍微修改的行爲的方法,你可以修改並用base.TheMethod()調用基類方法。這看起來像這樣:

public override void FireMissiles() 
{ 
    PrimeMissiles(); 

    base.FireMissiles(); 
} 

調用基類構造函數和基類方法的語法有所不同,如您所見。

4

您列出的語法意味着此構造函數在繼續構造此對象的其餘部分之前使用參數splashForm調用超類的構造函數。如果沒有列出父類的構造,假定無參數的構造函數,即:

public SplashAppContext(Form mainForm, Form splashForm) 
{ ... } 

是調用父類的構造和傳遞splashForm它相當於

public SplashAppContext(Form mainForm, Form splashForm) : base() 
{ ... } 
2
: base(splashForm) 

1

這實際上並不是一個繼承的情況,這個語法指定的是在調用SplashAppContext的構造函數之前,應該使用splashForm作爲參數傳遞它的基礎構造函數。

4

這是什麼?

這條線被稱爲constructor initializer。它的意思是「用參數splashForm調用基類的構造函數,然後啓動這個構造函數的主體」。

當沒有爲構造函數明確指定構造函數初始值設定項時,假定您想要base(),無參數構造函數。

...這是可能的普通方法嗎?

對於常規方法,您當然可以調用基類方法(使用base.SomeMethod(...)),但是沒有「初始化方法」可用。

1

這是調用直接父類的構造函數的語法。這是C#語法,而VB.NET要求您在構造函數中調用MyBase.New(splashForm)作爲第一行代碼。

這是用這種方式表達的,因爲在子構造函數代碼開始執行時,父對象被保證完全構造和初始化。正因爲如此,這兩個編譯器(VB。NET和C#)指定在調用父構造函數之前(如果不指定父構造函數並且存在無參數構造函數,它將自動調用),您可能不執行任何自己的代碼。

對於其他方法調用,此語法不可能(也不必要),因爲可以通過在代碼中調用base.FunctionName()來調用任何其他函數的基本實現。構造函數只是特例,因爲它們必須在任何其他代碼之前執行。