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

StackOverflow https://stackoverflow.com/questions/2534369

Вопрос

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

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. Анкет Для этого объекта он будет выглядеть точно так же, как объект свойств, но за кулисами MyClass на самом деле вычисляет и изменяет результаты полей. Этот метод объявления, очевидно, неверен, так как я не могу получить доступ GetActualName() а также SetActualName() из SubProperties определение. Как я бы достиг чего -то подобного?

Это было полезно?

Решение

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

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 из подпроперти.

Другие советы

public virtual string Name { get; set; }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top