簡體   English   中英

C# - 讓所有派生類都調用基類構造函數

[英]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
}

您可以在以下頁面中找到有關構造函數的更多信息:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/using-constructors

在派生類中,如果沒有使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM