Ani*_*ani 0 c# properties base-class derived-class
我有以下代码.
class A
{
public virtual int BoardSize { get; set; }
}
class B : A
{
public override int BoardSize
{
get{return 100;}
}
}
Class Client
{
B b = new B();
b.BoardSize = 55;
}
Run Code Online (Sandbox Code Playgroud)
在基类中,属性是可读/写的.但是在派生类中它是readonly并且应该总是返回100.虽然当我运行代码时我发现它总是按预期返回100.
但是,我不希望客户端在B类中设置BoardSize.所以它不应该允许客户端写b.BoardSize = 55.
这怎么可能?
简短的回答:嗯......你做不到!
答案很简单:
您可以使用以下方法隐藏BoardSize基类的实现new:
class B : A
{
public new int BoardSize
{
get{return 100;}
}
}
Run Code Online (Sandbox Code Playgroud)
这将使以下代码无效:
B b = new B();
b.BoardSize = 55;
Run Code Online (Sandbox Code Playgroud)
但这只会让事情变得更糟!
以下代码有效:
A a = new B();
a.BoardSize = 55;
Console.WriteLine(a.BoardSize);
Console.WriteLine(((B)a).BoardSize);
Run Code Online (Sandbox Code Playgroud)
它打印出来
55
100
结论:
您可以new用来实现目标,但这会在代码中引入严重问题.
如果您无法更改A并B需要派生自A那么使用此代码:
class B : A
{
public override int BoardSize
{
get{return 100;}
set{throw new NotSupportedException();}
}
}
Run Code Online (Sandbox Code Playgroud)
这与.NET框架是一致的.例如,ReadOnlyCollection在调用Add(将其转换为ICollection<T>)之后抛出此异常.
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |