C#,读/写分离和属性。需要模式

时间:2011-07-04 19:34:00

标签: c# properties design-patterns

好的,所以C#有属性

public int Prop {get;set;}

我可以将getter和setter放在不同的接口上,如下所示:

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-esque的方式在每个接口上使用单独的getter / setter方法。但是否定了财产的好处+其中一个警察计划​​会对我大喊大叫。

1 个答案:

答案 0 :(得分:4)

您可以对基本setter进行保护,并将派生类实现IWrite显式委派给基本setter:

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。)