假设我有一个带有成员int的类A,number它有一个getter和一个setter.
然后我创建一个A的子类并将其命名为B.现在,在BI类中希望保留该成员number,但是在这个类中我想强加number只读的限制.我怎样才能做到这一点?
对此的需求通常暗示您的设计不是最优的(因为它违反了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)
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |