这更像是一个“有更好的方法”问题,而不是真正的问题。
拥有仅在基类中访问的属性时:
private const bool isSomething = true;
我有时必须在从这个类继承的项目中更改此值。但由于它是一个常量并且在类范围内使用,我通常会将基类中的代码更改为:
private const bool isSomething = true;
protected virtual bool IsSomething{
get{
return isSomething;
}
}
覆盖子类中的属性并创建一个新的isSomething
常量。
这会创建一个新字段和覆盖,在我看来,这不是很好的风格。有更好的方法吗?
该值是一个常量,它将在我正在使用它的完整项目中保持不变。
答案 0 :(得分:3)
如果您需要根据所在的类设置值,但不希望稍后更改该值,则const
不是正确的关键字。相反,您可以使用readonly
并要求子类将值传递给构造函数。
readonly关键字与const关键字不同。 const字段只能在字段声明时初始化。可以在声明或构造函数中初始化只读字段。因此,readonly字段可以具有不同的值,具体取决于所使用的构造函数。此外,虽然const字段是编译时常量,但readonly字段可用于运行时常量... Source
修改强>
总结一下:您有一个只能由基类访问的字段,并且基类永远不应该改变该值。在大多数情况下,默认值很好。但是,有些情况会在子类需要设置自己的值而不是默认值时出现。
class Base {
private readonly bool _isSomething;
public Base() : this(false) {}
protected Base(bool isSomething)
{
_isSomething = isSomething;
}
}
class Child {
public Child() : base(true) {}
}
这提供了与您建议的解决方法相同的功能。无法更改该值,只有子类可以提供不同的值。它还有一个额外的好处,即不允许子类使值无效。覆盖方法允许:
protected override bool IsSomething{
get{
return BOOLEAN_EXPRESSION;
}
}
我理解你将它设为静态值的想法(因为我们知道每个实例都会使用相同的值),但这只会使事情变得复杂,因为静态项不会被继承。