2015-08-09 1 views
2

У меня есть 3 класса MetaA, MetaB и MetaC. Каждый из них имеет ряд свойств.Свойства доступа к объектам в объекте

Существуют определенные ситуации, когда было бы неплохо иметь только один класс, который содержит свойства всех трех классов Meta, называемых, например, MetaComposite. В составном классе, я попытался создать и экземпляр каждого MetaA, B и C, в надежде, что я мог бы получить доступ к свойствам, как так:

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

Поскольку C# не позволяет множественное наследование, что это лучший способ создания класса, который является составной частью других классов? Я мог бы помещать поля и писать геттеры и сеттеры в составном классе для передачи значений свойств, но это было бы много дублированного кода.

Каков правильный подход?

+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; } 
    } 
}