2014-01-09 3 views
1

Почему мы создаем абстрактные классы, хотя все методы этого класса уже определены? Если ответ заключается в том, чтобы остановить программиста от создания объекта этого класса, не удалось ли мы добиться того же, используя частный конструктор?Почему мы создаем абстрактный класс, хотя все методы этого класса определены?

+0

Если вы реализуете все методы, вам не нужно создавать абстрактные классы. – TheLostMind

+0

Можете ли вы привести нам пример того, где это делается? – Keppil

+0

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

ответ

1

Шаблон проектирования создания класса как abstract, хотя все методы определены, используется, когда абстрактный класс «ничего не делает» или реализации исключений из методов.

Мы можем увидеть это в действии в HttpServlet класса, который имеет реализации для каждого из веб-методов (doGet(), doPost(), doPut() и doDelete()), которые бросают ServletException и который подкласс должен переопределить, если они хотят, класс, который делает что-то полезное для определенного веб-метода.

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

+0

У меня есть идея. Спасибо Пол – Shivam

+0

Нет проблем! @Bohemian: P –

3

Идея абстрактного класса является общей базой для ряда других классов ..

Придумайте «Animals» .. Вы не можете создать что-то под названием «Animal» ..

Вы Cats и собак и кроликов, которые являются «животными».

У вас есть абстрактный класс под названием «Животное», а затем у вас есть класс Cat, который расширяет Animal или Dog, который расширяет Animal ... но вы не создаете экземпляр класса «Animal» непосредственно как его единственную общую базу ,

+0

Это не отвечает на вопрос. –

+0

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

+0

Я думаю, вы правы - я бы просто дал понять, что «Animal» не обязательно требует абстрактных методов или каких-либо методов вообще. Таким образом, актуальность вопроса однозначна. –

9

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

Класс, не имеющий частных конструкторов, предотвращает подклассу, а также публичную копию.

Из вышесказанного вы можете видеть, что эти две вещи служат двум различным целям. Класс может иметь либо —, либо даже как.

0

В абстрактном классе вы можете определить константы, которые являются общими для многого класса

0

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

+0

Это не будет отличаться от использования частного конструктора, и это чаще используется для классов утилит, поскольку оно также предотвращает подтипирование. –

1

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

Хотя предотвращение использования private конструктора будет населяют подклассов.

Абстрактные классы без абстрактных методов, возможно, ошибка разработчика.

+0

Некоторые из классов фреймворка являются абстрактными, даже если они содержат конкретные методы, такие как класс ActionForm рамок struts ..... – Shivam

0

В частности, касается использования абстрактных или скрывающих конструктор: ключевое слово abstract более четко заявляет архитектурное предназначение программиста. Это лучше.

Тот факт, что они предоставили стандартные реализации всех методов, является отдельным вопросом.

Смежные вопросы