2014-12-03 67 views
2

我有一個基類和一個繼承子類。如何避免繼承的類必須通過基類構造函數參數

基類構造函數接受一個參數,我不想從我的子構造函數傳遞參數。

參數是一個通用的List<MyInterface>

這有可能與C#?

此刻我的子類的構造函數如下:

public ChildClass() : base (new List<MyInterface>()); 

有,而無需新出列表更好的辦法?

+7

要麼在您的基類中定義無參數構造函數,要麼將null/new List傳遞給您的基類構造函數。 – Habib 2014-12-03 13:31:07

+6

引入一個必需的參數,然後根據它的必要性進行工作可能會提示設計錯誤。 – Codor 2014-12-03 13:33:44

+0

但是null參數只在基類邏輯允許的情況下才起作用 – Jauch 2014-12-03 13:35:31

回答

4

如果你的基類的構造函數需要你有一個參數從Child類傳遞該參數。

您有兩種選擇。

  1. 在基類中定義無參數構造函數,然後可以避免傳遞參數。 (基於@aevitas評論,如果你要遵循的方法,你可以定義參數的構造函數爲protected,因爲這將只提供給子類)

像:

public class BaseClass 
{ 
    public BaseClass() // or protected 
    { 
    //does nothing 
    } 
} 

,然後調用它像:

public ChildClass() : base(); 

或只是

public ChildClass() //Since base() would be called implicitly. 
  1. 其他選項是您現在正在使用的,您可以根據您的要求傳遞一個新的清單實例或null

您還應該重新訪問您的設計。在基類中沒有無參數構造函數意味着類對象需要該特定參數才能工作。解決它是一個code smell

+1

如果您這樣想,可能需要將無參數構造函數聲明爲'protected',以確保特定的構造函數僅由派生類型使用。 – aevitas 2014-12-03 14:09:52

+0

@aevitas,這是一個很好的建議,補充說,答案 – Habib 2014-12-03 14:21:10

1

您可以在您的基類上添加一個無參數構造函數,爲您創建新的List?除此之外,不,你必須這樣做。

您將有兩個構造函數,像這樣:

public BaseClass(List<MyInterface> newList) 
{ 
    //blah blah blah 
} 

public BaseClass() 
{ 
    var myList = new List<MyInterface>(); 
} 
+0

此外,如果這不會中斷程序,那麼可以將null作爲參數傳遞給基類構造函數 – Jauch 2014-12-03 13:34:36

1

你的基類必須要麼

A) define a parameterless constructor so that you can invoke base() 

或者

B) be ok with accepting a null value for the List<MyInterface> param 
0

就像大家都說過的,要麼在基類中需要無參數的構造函數,要麼需要傳遞參數。如果在子類中完全不需要該參數,那麼這可能是一種代碼異味。

如果您只希望您的子類能夠訪問無參數的構造函數,並且沒有其他人可以使其生成protected

public class BaseClass { 
    protected BaseClass() : this(new List<MyInterface>()) { 
    } 
    public BaseClass(List<MyInterface> newList) 
    { 
     //blah blah blah 
    } 
}