На самом деле вы можете расширить интерфейс - в случае, если вы определяете другой интерфейс.
Есть много квазирелигиозных аргументов по этому вопросу, и я сомневаюсь, что есть четкий правильный ответ, но для чего бы это ни стоило, это мой взгляд на вещи. Используйте подклассы (т. Е. extends
), когда ваши различные классы предоставляют одинаковую функциональность и имеют некоторые общие детали реализации. Используйте реализацию интерфейса , чтобы сигнализировать, что ваши классы предоставляют определенную функциональность (как указано в интерфейсе).
Обратите внимание, что они не являются взаимоисключающими; фактически, если суперкласс реализует интерфейс, то любые подклассы также будут рассматриваться для реализации этого интерфейса.
В Java нет множественного наследования, так что (под) класс может иметь только один родительский класс, и подклассы следует тщательно продумать, чтобы выбрать подходящего родителя, если он вообще существует; выбор родителя, который отражает лишь небольшое количество способностей класса, может закончиться разочарованием позже, если появятся другие разумные родительские классы. Так, например, наличие AbstractSQLExecutor
с подклассами SQL Server и Oracle имеет большой смысл; но иметь родительский класс FileUtils с некоторыми служебными методами, а затем наследовать его повсеместно для наследования этой функциональности - плохая идея (в этом случае вам, вероятно, следует объявить статические методы-помощники или содержать ссылку на Вместо этого экземпляр FileUtils).
Кроме того, подклассы связывают вас с деталями реализации (вашего родителя) больше, чем с реализацией интерфейса. Я бы сказал, что в общем случае лучше просто реализовать интерфейс, по крайней мере на начальном этапе, и формировать иерархии классов только в одинаковых или похожих пакетах с четкой иерархической структурой.