Должен ли абстрактный класс иметь хотя бы один абстрактный метод? - PullRequest
19 голосов
/ 17 февраля 2010

Обязательно ли для абстрактного класса иметь хотя бы один абстрактный метод?

Ответы [ 5 ]

15 голосов
/ 17 февраля 2010

Тема этого поста и тело задают два разных вопроса:

  1. Должен ли он иметь хотя бы один абстрактный член?
  2. Нужно ли иметь хотя бы одного абстрактного члена?

Ответ на # 2 окончательно нет.

Ответ на вопрос № 1 субъективен и зависит от стиля. Лично я бы сказал да. Если ваша цель - предотвратить создание экземпляра класса (без абстрактных методов), лучший способ справиться с этим - с помощью конструктора privateprotected, а не с пометкой abstract.

14 голосов
/ 17 февраля 2010

Нет, это не обязательно.Вы часто видите это в «шаблонном методе» шаблоне проектирования, например HttpServlet, в котором для каждого метода уже определено поведение по умолчанию и вы можете переопределить только один (или несколько) их вместо всех из них.

10 голосов
/ 17 февраля 2010

В JDK 1.0 действительно было необходимо иметь хотя бы один абстрактный метод в абстрактном классе. Это ограничение было снято в JDK 1.1 (1997? (Я старый)) и такие классы добавлены в библиотеку Java, как java.awt.event.KeyAdapter.

В C ++ вам нужна как минимум одна чисто виртуальная функция для создания подкласса и как минимум одна виртуальная функция для добавления RTTI в класс. Обычно имеет смысл использовать деструктор.

Обратите внимание, что при переопределении неабстрактных методов рекомендуется использовать @Override. Он не только сообщает читателю важную информацию о том, что пытается сделать код, но также обнаруживает распространенные ошибки, когда опечатки или неправильные типы параметров предотвращают переопределение.

6 голосов
/ 17 февраля 2010

Нет - вы можете объявить абстрактный класс без каких-либо абстрактных методов.Это может не иметь никакого смысла концептуально для существования экземпляра этого класса, или вы можете захотеть убедиться, что только подклассы этого класса могут быть созданы (по любой причине)

0 голосов
/ 17 февраля 2010

Если у класса в объявлении есть модификатор abstract, он становится abstract class.

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