继承常量 - 最好的风格?

时间:2011-05-16 20:33:41

标签: c# inheritance coding-style

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

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

 private const bool isSomething = true;

我有时必须在从这个类继承的项目中更改此值。但由于它是一个常量并且在类范围内使用,我通常会将基类中的代码更改为:

 private const bool isSomething = true;
 protected virtual bool IsSomething{
       get{
           return isSomething;
       }
 }

覆盖子类中的属性并创建一个新的isSomething常量。

这会创建一个新字段和覆盖,在我看来,这不是很好的风格。有更好的方法吗?

该值是一个常量,它将在我正在使用它的完整项目中保持不变。

1 个答案:

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

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