2017-04-18 62 views
0

說我有一個抽象超,A,其被定義爲:省略一個子類的構造的在C#參數

public abstract class A { 
    protected string a1; 
    protected int a2; 
    protected char a3; 

    public A(string a1, int a2, char a3) { 
     this.a1 = a1; 
     this.a2 = a2; 
     this.a3 = a3; 
    } 
} 

我然後具有從A繼承X類 - 每個使用相同的構造 - 但每個都有自己的方法,它們以各自獨特的方式使用a1,a2和a3。儘管構造是相同的,從我的理解我不得不在每個子類中重新定義像這樣的參數的數量和類型:

public sub(string a1, int a2, char a3) : base(a1, a2, a3) {} 

這可能是一個痛苦,如果我需要改變的類型因爲我需要調整所有11個類。如果我使用良好的繼承實踐,在大多數情況下,如果我修改A的構造函數的參數,所有類都應該受到影響,但有些情況並非如此。例如,如果我將參數從Vehicle更改爲CarCarVehicle的一個子類,所以它具有所有的Vehicle的API成員,並且除了它們的構造函數外,沒有任何類需要更改。

有沒有辦法做到的線沿線的東西:

public sub { 
    public sub(...) : base(...) {} 
} 

,這樣就沒有必要改變所有10子類構造函數定義時參數類型的改變?

回答

2

不,沒有它的語法糖。

你可以用所有的參數中的一類,以便更改參數不會影響所有類型的,但是你可以很容易錯過新添加的參數的處理:

class ConstructorParams 
{ 
    public int a {get;set;} 
} 

... 
public Base(ConstructorParams p) {...} 
... 
public Sub(ConstructorParams p) : Base(p) {} 

注意,使用重構工具在VS(和外部像R#)對方法/構造函數的參數進行了大部分自動更改 - 因此在將所有參數打包到單個類之前先嚐試這些方法可能是個好主意。

+0

啊,關於重構的好點。我的背景是使用腳本編寫,使用像Notepad ++這樣的編輯器,其中最接近重構的是Find和Replace,所以我完全忘了它。 – Drew

相關問題