2015-08-09 62 views
2

我有3個類MetaA,MetaB和MetaC。每個都有一些屬性。訪問對象在對象中的屬性

在某些情況下,只有一個類包含所有三個Meta類的屬性(例如MetaComposite)會很好。在複合類,我都試過,希望我可以訪問像這樣的屬性創建和每個MetaA,B和C的實例:

Meta Composite mc = new MetaComposite(); 
mc.MetaA.Property1 = "Hello"; 

由於C#不允許多重繼承,什麼是最好的方法創建一個由其他類組成的類?我可以放置字段並在複合類中寫入getter和setter來傳遞屬性值,但這會是很多重複的代碼。

這裏的正確方法是什麼?

+0

C#支持通過接口 –

回答

2

什麼是有一流水平的所有屬性的原因是什麼? 爲什麼不簡單地使用你寫的東西?

class MetaComposite 
{ 
    public MetaAClass MetaA { get; private set; } 
    public MetaBClass MetaB { get; private set; } 
    public MetaCClass MetaC { get; private set; } 

    public MetaComposite() 
    { 
     MetaA = new MetaAClass(); 
     MetaB = new MetaBClass(); 
     MetaC = new MetaCClass(); 
    } 
} 

public void Main() 
{ 
    var composite = new MetaComposite(); 
    composite.MetaA.Field1 = 1; 
    composite.MetaB.Field2 = '2'; 
    composite.MetaC.Field3 = new MetaDClass(); 
} 
+0

多繼承這似乎正是我之後,我也嘗試了,不過我做的最愚蠢的事。當我編寫代碼來實例化一個MetaComposite來測試它時,它在一個類中,而不是在一個方法中。我真的很喜歡自己!一直在看它幾個小時,想知道這個問題。謝謝! –

+0

我想我早些時候嘗試過,甚至可能已經開始工作,但我不知道你可以添加{get;私人設置; }到一個不是基元的對象。我想我最初不這樣做,因爲風格的警察抱怨公共領域,但添加{get;私人設置; }讓它開心。 –

+0

不客氣。你能否選擇一個答案? – dmay

5

如何爲所有三個Meta類創建接口,並讓MetaComposite類實現所有這三個接口。 MetaComposite類可以實例化正確的Meta類並調用它來執行所需的屬性。

下面是一個例子:

public interface IMeta1 
{ 
    int Metaproperty1 {get; set;} 
} 

public interface IMeta2 
{ 
    int Metaproperty2 {get; set;} 
} 

public interface IMeta3 
{ 
    int Metaproperty3 {get; set;} 
} 

public class MetaComposite : IMeta1, IMeta2, IMeta3 
{ 
    private readonly Meta1 _meta1; 
    private readonly Meta2 _meta2; 
    private readonly Meta3 _meta3; 

    public MetaComposite() 
    { 
     _meta1 = new Meta1(); 
     _meta2 = new Meta2(); 
     _meta3 = new Meta3(); 
    } 

    public int Property1 
    { 
     get { return _meta1.Property1; } 
     set { _meta1.Property1 = value; } 
    } 

    public int Property2 
    { 
     get { return _meta2.Property2; } 
     set { _meta2.Property2 = value; } 
    } 

    public int Property3 
    { 
     get { return _meta3.Property3; } 
     set { _meta3.Property3 = value; } 
    } 
}