Почему AbstractAction не реализует actionPerformed()?

Учебный класс AbstractAction реализует интерфейс Action, но в Actionесть метод actionPerformed(ActionEvent e) который наследует от интерфейса ActionListener
Я знаю, что класс реализует интерфейс и должен обеспечивать все реализации методов в этом интерфейсе.
Но я обнаружил, что нет реализации actionPerformed(ActionEvent e) в AbstractAction, Зачем?

3 ответа

Решение

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

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

Я знаю, что класс реализует интерфейс и должен обеспечивать все реализации методов в этом интерфейсе.

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

Но я обнаружил, что в AbstractAction нет реализации actionPerformed (ActionEvent e), почему?

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

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

abstract класс может быть неполным. Абстрактные классы не обязаны реализовывать какие-либо или все методы, определенные интерфейсом или родительским абстрактным классом. Кроме того, абстрактный класс может объявлять новые абстрактные методы, которые должен реализовывать любой подкласс.

Цена, заплаченная за создание абстрактного класса, состоит в том, что он не может быть создан непосредственно. То есть абстрактный класс должен быть расширен для использования.

Другие вопросы по тегам