Наследовать константы - лучший стиль? - PullRequest
1 голос
/ 17 мая 2011

Это скорее вопрос "есть ли лучший путь", чем реальная проблема.

При наличии свойства, которое доступно только в базовом классе:

 private const bool isSomething = true;

Мне иногда приходится менять это значение в проекте, где я наследую от этого класса. Но так как он является константой и используется для всего класса, я обычно меняю код в базовом классе на что-то вроде этого:

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

И переопределите свойство в подклассе и создайте новую isSomething константу.

Это создает новое поле и переопределение, и, на мой взгляд, это не очень хороший стиль. Есть ли лучший способ сделать это?

Значение является константой, и оно будет постоянным во всем проекте, где я его использую.

1 Ответ

3 голосов
/ 17 мая 2011

Если вам нужно установить значение в зависимости от того, в каком классе вы находитесь, но не хотите, чтобы это значение изменилось позже, то 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;
   }
}

Я понимаю вашу идею сделать его статическим значением (поскольку мы знаем, что каждый экземпляр будет использовать одно и то же значение), но это только усложняет ситуацию, поскольку статические элементы не наследуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...