![](/img/trans.png)
[英]C# null base-class constructor for XML Serialisation … that derived classes cannot call?
[英]C# - Making all derived classes call the base class constructor
我有一個基類 Character,它有幾個派生自它的類。 基類具有各種字段和方法。
我的所有派生類都使用相同的基類構造函數,但是如果我不在派生類中重新定義構造函數,則會出現錯誤:
錯誤:類“子類”不包含采用此數量參數的構造函數
我不想在每個派生類中重新定義構造函數,因為如果構造函數發生變化,我必須在每個類中更改它,請原諒任何誤解,這與只編寫一次代碼的想法背道而馳?
您可以使用以下語法從派生自它的類調用基類構造函數:
public DerivedClass() : base() {
// Do additional work here otherwise you can leave it empty
}
這將首先調用基構造函數,然后它將在此派生構造函數中執行任何其他語句(如果有)。
請注意,如果基本構造函數接受參數,您可以這樣做:
public DerivedClass(int parameter1, string parameter2)
: base(parameter1, parameter2) {
// DerivedClass parameter types have to match base class types
// Do additional work here otherwise you can leave it empty
}
您可以在以下頁面中找到有關構造函數的更多信息:
在派生類中,如果沒有使用
base
關鍵字顯式調用基類構造函數,則默認構造函數(如果有)將被隱式調用。
你必須重新聲明構造函數,因為他們不能有效繼承。 如果您認為構造函數在某些方面有點像靜態方法,這是有道理的。
特別是,您不希望所有構造函數都被自動繼承——畢竟,這意味着每個類都會有一個無參數的構造函數,就像object
本身一樣。
但是,如果您只想調用基類構造函數,則不需要在構造函數的主體中編寫任何代碼 - 只需按照 Waleed 的帖子將參數傳遞給基類即可。
如果您的基類開始需要更多信息,那么您很自然地應該更改所有派生類——實際上是任何調用這些類的構造函數的東西——因為它們必須提供信息。 我知道這看起來很痛苦,但這只是構造函數所做的自然結果。
我遇到了同樣的問題,我通過用這樣的工廠方法替換我的構造函數來解決它:
A 是父類。
public static T getChild<T>(int number) where T:A, new()
{
T child = new T();
T._number = number;
return child;
}
您可以創建一個 Child 類
Child b = A.getChild<Child>(2);
一種替代方法可能是依賴依賴注入容器來初始化您的對象,這樣對基類的引用(可能是對基構造函數或其他初始化方法的調用)將“外部化”到 DI 容器。
我不知道這對你的情況是否有意義
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.