2012-06-30 138 views
24

是否有可能重寫派生類中基類的構造函數?是否有可能重寫C#中的構造函數?

如果是這樣,它如何實現,以及在什麼情況下這是實用的?如果不是,爲什麼不呢?

+1

親愛的專家編碼來自邏輯我只是問resion – naval

+4

其他人已經回答好。如果你不知道「chainig」構造函數的語法,就像這樣:'internal MyClass(s​​tring name):base(null,0,name){...}'。在這個例子中,構造函數使用三個參數調用基礎構造函數。 –

+0

重新打開選民:請在投票重新開放之前將問題修改爲通常的標準。 –

回答

43

不,你不能重寫構造函數。這個概念在C#中沒有意義,因爲構造函數並不是多態調用的。你總是說明你想要構建的是哪個類,以及構造函數的參數。

構造函數根本就沒有繼承 - 但派生類中的所有構造函數都必須鏈接到同一個類中的另一個構造函數,或者鏈接到基類中的某個構造函數。如果你沒有明確地做到這一點,編譯器會隱式鏈接到基類的無參數構造函數(如果該構造函數不存在或不可訪問,則會發生錯誤)。

+4

「這個概念沒有任何意義,真的 - 構造函數根本不是多態調用的。」 - 在德爾福,他們是。這是一個非常有用的功能,我可以通過使用反射並傳遞運行時檢查的'Type'實例或通過提供單獨的工廠類來找到C#中所需的解決方法,相比之下,這相當麻煩。 –

+3

@ O.R.Mapper:恩,是的,我正在討論C#的情況。其他語言所做的與這個答案無關。 –

+3

在這種情況下,我建議答案並不主張「這個概念毫無意義,真的」,因爲這聽起來很普遍。就像「這個概念會很有意義,但不可能在C#中使用這個概念,因爲構造函數不是在那裏以多態方式調用的。」可能會更清楚。 –

10

不,構造函數不是繼承的。你不能在派生類中重寫它們。
原因

一個基類的構造將永遠被調用,用於 每一個類,從物體下降,因爲每類必須 至少一個構造函數調用基()構造函數(明確 或暗示),並且每次調用this()構造函數都必須最終調用base()構造函數。

+0

Upvoted相關和很好的解釋! – KillABug

6

不,你不能重寫構造函數。

如果您看一下構造函數的基本語法,它應該與您正在編寫它的類具有相同的名稱。假設你寫了一個與基類同名的方法(與基類構造函數相同),它只是在派生類中沒有指定返回類型的新方法,這在句法上不正確。

+0

Upvoted爲一個簡單的解釋。 – KillABug

相關問題