如何限制覆盖属性是只读的

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.

这怎么可能?

Dan*_*rth 5

简短的回答:嗯......你做不到!
答案很简单:
您可以使用以下方法隐藏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用来实现目标,但这会在代码中引入严重问题.
如果您无法更改AB需要派生自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>)之后抛出此异常.