Должен ли базовый класс быть помечен как абстрактный, если нет абстрактных членов? - PullRequest
4 голосов
/ 04 февраля 2011

Можно ли помечать класс как абстрактный, если у него нет абстрактных членов?Даже если нет практической причины для непосредственного создания его экземпляра?(кроме модульных тестов)

Ответы [ 5 ]

8 голосов
/ 04 февраля 2011

Да, разумно и выгодно явно пометить как абстрактный базовый класс, экземпляр которого не следует создавать - даже в отсутствие абстрактных методов.

  • Он применяет общее руководство для абстрагирования не листовых классов.
  • Запрещает другим программистам создавать экземпляры класса. Это может упростить добавление к нему абстрактных методов позже.
4 голосов
/ 04 февраля 2011

Краткий ответ: да.

Длинный ответ: Ключевое слово abstract помечает класс и / или его членов как бесполезные напрямую.Почему это может варьироваться от случая к случаю;абстрактный класс может быть слишком базовым, чтобы выполнять какую-либо реальную работу, или он может содержать абстрактные члены, которые необходимы для работы другого кода в этом классе, но не могут быть конкретно определены на этом уровне.Суть в том, что, отмечая абстрактный класс, вы говорите компилятору и другим разработчикам не создавать экземпляр этого класса напрямую, а вместо этого наследовать его для создания конкретной полезной реализации.Вы можете сделать это, даже если у класса есть рабочая реализация для всех его членов, если вы чувствуете, что класс должен быть унаследован, чтобы наилучшим образом использовать эту реализацию.

4 голосов
/ 04 февраля 2011

Хотите ли вы, чтобы у этого класса был фактический экземпляр?Если да, то не помечайте это как абстрактное.Если нет, то отметьте это как абстрактное.

1 голос
/ 04 февраля 2011

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

Если, однако, цель состоит в том, чтобы создать некоторую форму класса Utility -тот, который имеет только static членов - лучший способ справиться с этим - дать классу один конструктор, помеченный private.Таким образом, класс не может быть ни создан, ни помещен в подкласс.Это посылает четкий сигнал о том, что единственным использованием класса является использование его static методов.(Это совет от Джоша Блоха Effective Java )

0 голосов
/ 04 февраля 2011

Да, я так думаю. По крайней мере, так я делаю время от времени; -)

...