继承常量 - 最佳样式



这更像是一个"有没有更好的方法"的问题,而不是一个真正的问题。

当具有仅在基类中访问的属性时:

 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;
   }
}

我理解您将其设置为静态值的想法(因为我们知道每个实例都会使用相同的值),但这只会使事情变得复杂,因为静态项目不是继承的。

最新更新