C #, чтение / запись разделение и свойства.Требуется шаблон - PullRequest
2 голосов
/ 04 июля 2011

Хорошо, поэтому у C # есть свойства

public int Prop {get;set;}

Я могу поместить геттер и сеттер на разные интерфейсы, как это:

public interface IRead
{ int AnInt { get; } }

public interface IWrite
{ int AnInt { set; } }

И затем смешивать и сопоставлять их следующим образом:

public class WorkingClass : IRead, IWrite
{
    public int AnInt { get; set; }
}

Там, где он начинает работать неправильно, у меня может быть базовый объект.

public class BaseClass : IRead
{
    private int _anInt;

    public BaseClass(int anInt)
    { _anInt = anInt; }

    public virtual int AnInt
    { get { return _anInt; } }
}

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

public class Derived : BaseClass, IWrite //bits elided
{
    public override int AnInt
    {
        get { return base.AnInt; }
        set { throw new NotImplementedException(); } //<-- error
    }
}

Что, конечно, не работает.

На самом деле это случается не так часто.Я предпочитаю иметь методы с изменением состояния и иметь свойства только для чтения.Я думаю, это дизайн 101, но в качестве надуманного примера у меня было бы свойство Age, содержащее только get, а затем метод IncreaseAge.

Итак, учитывая все это.Если бы вы хотели иметь изменяемый объект с отдельными интерфейсами чтения и записи, как бы вы это сделали?

Я мог бы сделать это в стиле Java с использованием отдельных методов getter / setter на каждом интерфейсе.Но это сводит на нет преимущества свойств + одна из полицейских программ будет кричать на меня.

1 Ответ

4 голосов
/ 04 июля 2011

У вас может быть защищен базовый установщик, а производный класс реализует IWrite, явно делегирующий базовому установщику:

public class BaseClass : IRead {
  public BaseClass(int anInt) { AnInt = anInt; }

  public int AnInt {
    get; protected set;
  }
}

public class Derived : BaseClass, IWrite {
  public Derived(int anInt) : base(anInt) { }

  int IWrite.AnInt {
    set { base.AnInt = value; }
  }
}

(ключевое слово base может быть даже опущено, а базовое свойство нене должно быть virtual.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...