使子类中的成员只读

Héc*_*orn 1 c# inheritance

假设我有一个带有成员int的类A,number它有一个getter和一个setter.

然后我创建一个A的子类并将其命名为B.现在,在BI类中希望保留该成员number,但是在这个类中我想强加number只读的限制.我怎样才能做到这一点?

Seb*_*zus 8

对此的需求通常暗示您的设计不是最优的(因为它违反了Liskov替代原则).因此,C#并不真正支持它.但是,这里有两种方法一种实现:

(1)隐藏后代中的属性并提供替换基类的getter的新属性.但是这并没有真正保护属性,因为你可以只强制转换为基类:

class A
{
  public int Number { get; set; }
}

class B : A
{
  public new int Number
  {
    get { return base.Number; }
  }
}

B b = new B();
// b.Number = 42; // This does not work.
A a = b;
a.Number = 42;
Console.WriteLine(b.Number); // == 42. Oops.
Run Code Online (Sandbox Code Playgroud)

(2)用异常抛出覆盖setter.但错误的用法现在导致运行时错误而不是编译器错误,这是不好的.考虑向bool CanSetNumber基础添加属性(.NET使用Stream.CanSeek和类似的东西Seek).

class A
{
  public virtual int Number { get; set; }
}

class B : A
{
  public override int Number
  {
    get { return base.Number; }
    set { throw new InvalidOperationException("B.Number is readonly!"); }
  }
}

B b = new B();
b.Number = 42; // BAM!
Run Code Online (Sandbox Code Playgroud)