我有一個基類字符有幾個派生它的類。基類有各種領域和方法。C# - 使所有派生類調用基類構造函數
我的派生類中都使用相同的基類構造函數,但是如果我沒有在我的派生類中重新定義構造函數我得到的錯誤:
錯誤:類「子類」不包含一個構造函數採用這個參數數
我不想在每個派生類中重新定義構造函數,因爲如果構造函數發生變化,我必須在每一個類中改變它,原諒任何誤解,違背只寫代碼一次的想法?
我有一個基類字符有幾個派生它的類。基類有各種領域和方法。C# - 使所有派生類調用基類構造函數
我的派生類中都使用相同的基類構造函數,但是如果我沒有在我的派生類中重新定義構造函數我得到的錯誤:
錯誤:類「子類」不包含一個構造函數採用這個參數數
我不想在每個派生類中重新定義構造函數,因爲如果構造函數發生變化,我必須在每一個類中改變它,原諒任何誤解,違背只寫代碼一次的想法?
你做有重新聲明構造函數,因爲它們實際上不是被繼承的。如果你認爲構造函數在某些方面有點像靜態方法,這是有道理的。
特別是,你不會想所有構造將自動繼承 - 畢竟,這將意味着,每類將有一個參數的構造函數,如object
本身一樣。
如果你只是想調用基類的構造函數,你不需要在構造函數的主體中編寫任何代碼 - 只需按照Waleed的帖子將參數傳遞給基類即可。
如果你的基類開始需要更多的信息,這是自然的,你應該改變所有派生類 - 實際上任何調用這些類的構造函數 - 因爲他們必須提供的信息。我知道這看起來像是一種痛苦,但這只是建設者所做的一個自然結果。
您可以使用以下格式從從它派生的類調用基類的構造函數:
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
一種替代方案可能是依賴於一個Dependency Injection容器來初始化你的對象,這樣對基類的引用(可能是對基類構造函數或另一個初始化方法的調用)會「外化」到DI容器。
我不知道,如果是有意義的你的情況還是不
我有同樣的問題,我用一個工廠方法類似這樣的替換我的構造方法解決了這個問題:
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);
一個子類,你在你的構造做什麼樣的工作?一般來說,應該在構造函數中完成除了實例化成員之外的其他工作。 – alexn 2010-11-28 13:16:22
是的只是實例化成員。基類包含所有派生類使用的5個字段,所以我只是將這些作爲構造函數參數傳遞並設置基類字段。 – Tom 2010-11-28 13:18:18
有點相關但不是重複:http://stackoverflow.com/q/12051/492 – 2013-11-08 09:18:48