c# - 在派生类中将属性设置为只读

标签 c# properties overriding access-modifiers

我正在覆盖派生类中的一个属性,我想将其设置为只读。 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/

相关文章:

c# - 如何在不更改属性值的情况下运行属性集?

objective-c - 在重写的类方法中调用 super

c# - 从控件中注销类处理程序 - WPF

java - 如何在 Web 应用程序中使用 java io 访问文件(Glassfish 服务器)

hadoop - 在 Hadoop 中将 dfs.blocksize 设置为 100Kb

ios - 为什么重写prepareForSegue会显示重写只能在类成员上指定

c# - 无法转换作为派生类的继承类字段

c# - 使用 jquery 调用带有 void 返回类型的方法后面的代码

c# - Console.WriteLine() 如何知道如何将对象转换为字符串

c# - 在 asp.net 中使用客户端和服务器验证器仅显示客户端验证