2013-10-16 81 views
0

我有2個類:「RootClass」和「SubClass」。子類是從RootClass派生的。如何在RootClass中創建一個構造函數,它可以將值設置爲在SubClass中找到的字段?如何設置派生類的字段?

我想:

  • 設置從根的構造函數,子類的值,但它不會看到子類的領域。
  • 在SubClass中創建一個構造函數,但似乎沒有發生。還嘗試將根中的構造函數設置爲虛擬,因此子構造函數可能會覆蓋它,也沒有運氣。
  • 在RootClass的構造函數中實例化SubClass,這看起來很愚蠢。

基本上我想要2班。子類與RootClass相同,只有一些額外的字段,我似乎無法應用一個值。 根據邏輯我可以創建一個根或子。

顯然我在這裏錯了路,我該怎麼做?

+1

你可以發佈你的代碼嗎? – Jonesopolis

+0

我不認爲你所要求的是可能的。也許你想看看Factory Method設計模式。 –

+0

請不要在工作中嘗試。 – rageit

回答

3

如何使一個構造在RootClass,可設置值在​​

你不能發現場 - 如就RootClass而言,​​不存在。

還試圖在根構造函數設置爲虛擬的,所以子構造可以覆蓋它

你不能 - 構造函數是不能繼承的,所以沒有「虛擬」構造概念。

這裏有一個「鏈接」構造的典型模式:

public class RootClass 
{ 
    public RootClass(int rootProperty) 
    { 
     this.RootProperty = rootProperty; 
    } 

    public int RootProperty {get; set;} 
} 
public class SubClass : RootClass 
{ 
                  v--- call the base constructor 
    public SubClass(int rootProperty, string subProperty) : base(rootProperty) 
    { 
     this.SubProperty = subProperty; 
    } 

    public string SubProperty {get; set} 
} 
5

一個基類不會知道它的子類。你所說的是錯的或者OOP或非常不尋常的情況下,

0

類不能知道所有從它繼承類的實現。

1

您無法從根類訪問派生類的任何成員。

的典型設計模式是創建一個方法:

virtual void Init(int a, int b) {} 
在你的基類

,其中的參數的任何信息的派生類將需要進行自初始化。從根類的構造函數調用它。

派生類則將需要一個構造

SubClass() : base() { } 

這將保證根類構造函數被調用,然後自己的init方法被調用。


然而,在這種情況下,您最好的設計模式是簡單的子類。

假設RootClass有成員int a和子類int b

class RootClass { 

    int a; 

    RootClass(int a) { 
     this.a = a; 
    } 
} 

class SubClass { 

    int b; 

    SubClass(int a, int b) : base(a) { 
     this.b = b; 
    } 
} 
1

一般情況下,基類不應該有自己的子類實施細則知識。你應該能夠提供自己的構造函數在子類實例化的領域,比如:

class SubClass : RootClass 
{ 
    private bool subClassfield; 

    public SubClass() : base() 
    { 
     subClassField = true; 
    } 
} 

如預期那樣,不是工作?請注意0​​表達式,它確保SubClass的構造函數調用基類的構造函數以保證在繼續之前初始化基類。

2

也許您正在尋找一種方法​​來調用RootClass的構造函數?

public class RootClass 
{ 
    public RootClass(int foo) 
    { 
    } 
} 

public class SubClass: RootClass 
{ 
    public SubClass(int foo) 
    : base(foo) // calls RootClass constructor 
    { 
     // now set Subclass fields 
    } 
} 
相關問題