继承常量 - 最佳样式
本文关键字:样式 最佳 常量 继承 | 更新日期: 2023-09-27 17:56:31
这更像是一个"有没有更好的方法"的问题,而不是一个真正的问题。
当具有仅在基类中访问的属性时:
private const bool isSomething = true;
我有时必须在从此类继承的项目中更改此值。但由于它是一个常量并在类范围内使用,我通常会将基类中的代码更改为如下所示:
private const bool isSomething = true;
protected virtual bool IsSomething{
get{
return isSomething;
}
}
并重写子类中的属性并创建新的isSomething
常量。
这创建了一个新字段和一个覆盖,在我看来,这不是一种很好的风格。有没有更好的方法可以做到这一点?
该值是一个常量,在我使用它的完整项目中它将是常量。
如果您需要根据您所在的类设置值,但不希望以后更改值,则 const
不是正确的关键字。相反,您可以使用 readonly
并要求子类将值传递给构造函数。
只读关键字与 const 关键字不同。const 字段只能在声明字段时初始化。只读字段可以在声明中或在构造函数中初始化。因此,只读字段可以具有不同的值,具体取决于所使用的构造函数。此外,虽然 const 字段是编译时常量,但只读字段可用于运行时常量... 源
编辑:
总结一下:您有一个仅由基类访问的文件,基类不应更改该值。在大多数情况下,默认值很好。但是,在某些情况下,当子类需要设置自己的值与默认值不同的值时。
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;
}
}
我理解您将其设置为静态值的想法(因为我们知道每个实例都会使用相同的值),但这只会使事情变得复杂,因为静态项目不是继承的。