我正在覆盖派生类中的一个属性,我想将其设置为只读。 C# 编译器不允许我更改访问修饰符,因此它必须保持公开。
执行此操作的最佳方法是什么?我应该在 set { }
中抛出一个 InvalidOperationException
吗?
最佳答案
让 setter 在派生类中抛出 InvalidOperationException
违反了 Liskov Subsitution Principle .本质上使 setter 的使用与基类的类型相关,这基本上消除了多态性的值(value)。
您的派生类必须遵守其基类的约定。如果 setter 并非在所有情况下都适用,则它不属于基类。
解决此问题的一种方法是稍微打破层次结构。
class C1 {
public virtual int ReadOnlyProperty { get; }
}
class C2 {
public sealed override int ReadOnlyProperty {
get { return Property; }
}
public int Property {
get { ... }
set { ... }
}
}
在这种情况下,您遇到问题的类型可以继承 C1
,其余类型可以切换为派生自 C2
关于c# - 在派生类中将属性设置为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4403925/