В C # я могу скрыть / изменить средства доступа в подклассах? - PullRequest
1 голос
/ 29 марта 2010

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

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 ]

2 голосов
/ 29 марта 2010

Вы ищете что-то подобное?

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 в экземпляр SubProperties, если вы хотите получить доступ к методам MyClass из SubProperties.

0 голосов
/ 29 марта 2010
public virtual string Name { get; set; }
...