2010-03-28 2 views
1

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

class Properties 
{ 
    public string Name { get; set; } 
} 

class MyClass 
{ 
    class SubProperties: Properties 
    { 
     public override Name 
     { 
      get { return GetActualName(); } 
      set { SetActualName(value); } 
     } 
    } 

    public SubProperties ClassProperties; 

    private string GetActualName() 
    { 
     return SomeFunction(); 
    } 

    private void SetActualName(string s) 
    { 
     ClassProperties.Name = SomeOtherFunction(s); 
    } 
} 

Идея заключается в том, чтобы иметь какой-либо объект, который инстанцирует MyClass есть полностью доступное свойство ClassProperties. Для этого объекта он будет выглядеть точно как объект Properties, но за кулисами MyClass фактически вычисляет и изменяет результаты полей. Этот метод декларации, очевидно, неверен, так как я не могу получить доступ к GetActualName() и SetActualName() из определения SubProperties. Как я могу добиться чего-то подобного?

ответ

2

Вы ищете что-то в этом роде?

abstract class Properties 
{ 
    public abstract string Name { get; set; } 
} 

class MyClass 
{ 
    private class SubProperties : Properties 
    { 
     private MyClass myClass; 

     public SubProperties(MyClass myClass) 
     { 
      this.myClass = myClass; 
     } 

     public override Name 
     { 
      get { return this.myClass.GetActualName(); } 
      set { this.myClass.SetActualName(value); } 
     } 
    } 

    private string name; 

    public MyClass 
    { 
     this.MyClassProperties = new SubProperties(this); 
    } 

    public Properties MyClassProperties { get; private set; } 

    private string GetActualName() 
    { 
     return this.name; 
    } 

    private void SetActualName(string s) 
    { 
     this.name = s; 
    } 
} 

Вы должны передать ссылку на экземпляр MyClass к экземпляру субсвойства, если вы хотите получить доступ к методам MyClass из субсвойства.

+0

Это похоже на то, что мне нужно, я сделаю это. Единственное реальное различие в том, что в моем случае нет личной переменной «name» в MyClass - это фактически чтение/запись в сокет, но я хочу полностью скрыть это от вызывающего объекта. Спасибо! – Diego

+0

Отлично. Это сделал трюк. – Diego

Смежные вопросы