Если вам нужно установить значение в зависимости от того, в каком классе вы находитесь, но не хотите, чтобы это значение изменилось позже, то const
не является правильным ключевым словом. Вместо этого вы можете использовать readonly
и требовать, чтобы подклассы передавали значение конструктору.
Ключевое слово readonly отличается от ключевого слова const. Константное поле может быть инициализировано только при объявлении поля. Поле только для чтения может быть инициализировано либо в объявлении, либо в конструкторе. Поэтому поля только для чтения могут иметь разные значения в зависимости от используемого конструктора. Кроме того, хотя поле const является константой времени компиляции, поле readonly может использоваться для констант времени выполнения ...
Источник
Edit:
Подводя итог: у вас есть поле, к которому имеет доступ только базовый класс, и базовый класс никогда не должен изменять это значение. В большинстве случаев значение по умолчанию в порядке. Однако существуют некоторые случаи, когда подклассу необходимо установить свое собственное значение, отличное от значения по умолчанию.
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;
}
}
Я понимаю вашу идею сделать его статическим значением (поскольку мы знаем, что каждый экземпляр будет использовать одно и то же значение), но это только усложняет ситуацию, поскольку статические элементы не наследуются.