2010-11-28 540 views
32

我有一個基類字符有幾個派生它的類。基類有各種領域和方法。C# - 使所有派生類調用基類構造函數

我的派生類中都使用相同的基類構造函數,但是如果我沒有在我的派生類中重新定義構造函數我得到的錯誤:

錯誤:類「子類」不包含一個構造函數採用這個參數數

我不想在每個派生類中重新定義構造函數,因爲如果構造函數發生變化,我必須在每一個類中改變它,原諒任何誤解,違背只寫代碼一次的想法?

+1

一個子類,你在你的構造做什麼樣的工作?一般來說,應該在構造函數中完成除了實例化成員之外的其他工作。 – alexn 2010-11-28 13:16:22

+0

是的只是實例化成員。基類包含所有派生類使用的5個字段,所以我只是將這些作爲構造函數參數傳遞並設置基類字段。 – Tom 2010-11-28 13:18:18

+0

有點相關但不是重複:http://stackoverflow.com/q/12051/492 – 2013-11-08 09:18:48

回答

43

有重新聲明構造函數,因爲它們實際上不是被繼承的。如果你認爲構造函數在某些方面有點像靜態方法,這是有道理的。

特別是,你不會想所有構造將自動繼承 - 畢竟,這將意味着,每將有一個參數的構造函數,如object本身一樣。

如果你只是想調用基類的構造函數,你不需要在構造函數的主體中編寫任何代碼 - 只需按照Waleed的帖子將參數傳遞給基類即可。

如果你的基類開始需要更多的信息,這是自然的,你應該改變所有派生類 - 實際上任何調用這些類的構造函數 - 因爲他們必須提供的信息。我知道這看起來像是一種痛苦,但這只是建設者所做的一個自然結果。

55

您可以使用以下格式從從它派生的類調用基類的構造函數:

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 
} 

您可以找到有關在以下頁面構造函數的詳細信息:

http://msdn.microsoft.com/en-us/library/ms173115%28VS.80%29.aspx

1

一種替代方案可能是依賴於一個Dependency Injection容器來初始化你的對象,這樣對基類的引用(可能是對基類構造函數或另一個初始化方法的調用)會「外化」到DI容器。

我不知道,如果是有意義的你的情況還是不

4

我有同樣的問題,我用一個工廠方法類似這樣的替換我的構造方法解決了這個問題:

A是父類。

public static T getChild<T>(int number) where T:A, new() 
{ 
    T child = new T(); 
    T._number = number; 
    return child; 

} 

您可以創建

Child b = A.getChild<Child>(2);

相關問題