Может ли класс быть абстрактным, даже если у него нет абстрактных методов? Если да Что толку? - PullRequest
6 голосов
/ 31 января 2010

У меня есть сомнения относительно того, что класс HttpServlet является абстрактным классом, хотя в классе нет абстрактного метода, все методы являются конкретными. Может ли класс быть абстрактным, даже если у него нет абстрактных методов? Если да Что толку?

Спасибо

Ответы [ 4 ]

18 голосов
/ 31 января 2010

В случае HttpServlet дело в том, что программисты сервлетов обычно не хотят, чтобы их сервлет поддерживал все 4 из основных методов HTTP (POST, GET, PUT, DELETE), поэтому было бы неудобно абстрактные методы doGet(), doPost() и т. д., поскольку программисты будут вынуждены реализовывать методы, которые им не нужны. Поэтому HttpServlet обеспечивает реализацию по умолчанию для всех тех методов, которые ничего не делают, кроме как возвращают код состояния ошибки клиенту. Программисты могут переопределить нужные им методы и не беспокоиться об остальном. Но на самом деле использование самого класса HttpServlet не имеет смысла (поскольку он ничего не делает полезного), поэтому он abstract.

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

6 голосов
/ 31 января 2010

Нельзя создавать экземпляры абстрактных классов, поэтому для их использования необходимо создать подклассы.
В подклассе вы все еще можете реализовать свои собственные методы или переопределить родительские методы.

Возможно, не имеет смысла использовать HttpServlet в качестве отдельного приложения, но оно обеспечивает необходимые функции по умолчанию в определенном контексте. Вы можете создать подкласс HttpServlet для обслуживания этого контекста и доступа к его функциям.

Подкласс HttpServlet не должен реализовывать методы, чтобы заставить работать его собственную функциональность.

3 голосов
/ 31 января 2010

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

Я не силен в Java, но я предполагаю, что HttpServlet предоставляет реализации своих методов по умолчанию, но вы должны переопределить некоторые из них. Все еще не имеет смысла иметь неспециализированный экземпляр этого класса, поэтому он абстрактный, поэтому компилятор дает подсказку всем, кто пытается.

2 голосов
/ 31 января 2010

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

...