好的,所以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方法。但是否定了财产的好处+其中一个警察计划会对我大喊大叫。
答案 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
。)