gpt4 book ai didi

c# - 使子类中的成员只读

转载 作者:太空宇宙 更新时间:2023-11-03 17:39:58 25 4
gpt4 key购买 nike

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

然后我创建一个 A 的子类并将其命名为 B。现在我希望在 B 类中保留成员 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.

(2) 用异常抛出覆盖setter。但是现在错误的使用会导致运行时错误,而不是编译器错误,这是不好的。考虑添加 bool CanSetNumber属性到基础(.NET 与 Stream.CanSeekSeek 类似)。
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!

关于c# - 使子类中的成员只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32010761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com