2010-04-20 184 views
3

有沒有什麼辦法可以延遲調用超類的構造函數,以便您可以先操作變量?有沒有辦法在傳遞給基類之前處理傳遞給子類構造函數的變量?

例如,

public class ParentClass 
{ 
    private int someVar; 

    public ParentClass(int someVar) 
    { 
     this.someVar = someVar; 
    } 
} 

public class ChildClass : ParentClass 
{ 
    public ChildClass(int someVar) : base(someVar) 
    { 
     someVar = someVar + 1 
    } 
} 

我希望能夠發送新價值someVar(someVar + 1)基類的構造函數,而不是一個到ChildClass構造函數。有沒有辦法做到這一點?

謝謝
馬特

回答

4
public class ChildClass : ParentClass 
{ 
    public ChildClass(int someVar) : base(someVar + 1) 
    { 
    } 
} 

現在,如果這個操作比遞增整數更加複雜,值得單獨的方法,你可以調用裏面base這種方法,但這種方法需要在

+0

yup。作爲一個便箋,我已經看到一些瘋狂的東西正在基地ctor。 – 2010-04-20 05:48:49

+0

它要複雜得多......包括髮布到url,返回html,遍歷dom,並抓取一個字符串。我不能使這個方法是靜態的,並且從基地調用它,因爲每個子類都有一個不同的抓取字符串的實現,而且基類沒有辦法告訴哪一個要調用。 我可以創建一個初始化方法,爲基類設置所有的變量......但是這就爲所有變量留下了一個setter。 – Matt 2010-04-20 06:17:50

+1

我懷疑把你剛剛在構造函數中描述的內容放在哪裏是個好主意。只要做好工作,計算任何事情,一旦完成將價值傳遞給構造函數,就把這個邏輯放到其他地方。 – 2010-04-20 06:19:30

0

這樣的事情呢?你可以有不同的實現,並將需要的東西傳遞給基類。

public interface ISomething 
{ 
    int DoSomething(int someVar); 
} 

public class Something : ISomething 
{ 
    private int someVar; 

    public Something(int someVar) 
    { 
     this.someVar = someVar; 
    } 

    public int DoSomething(int someVar) 
    { 
     return someVar + 1; 
    } 
} 

public class ParentClass 
{ 
    private int someVar; 

    public ParentClass(ISomething something) 
    { 
     this.someVar = something.DoSomething(someVar); 
    } 
} 

public class ChildClass : ParentClass 
{ 
    public ChildClass(int someVar) : base(new Something(someVar)) 
    { 

    } 
} 
相關問題