Итак, у вас есть интерфейс и абстрактный класс, который реализует подмножество методов в интерфейсе. У вас также есть некоторые классы, которые наследуют абстрактный класс и предоставляют реализации методов, которые абстрактный класс не дает.абстрактные классы и интерфейсы лучших практик в java
Итак, что лучше всего здесь? Я говорю о таких проблемах, как:
1) Должен ли абстрактный класс реализовать интерфейс или его дочерние классы? Должны ли каждый класс? Мне кажется, что только абстрактный класс должен. Конечно, все классы могли реализовать интерфейс, но это кажется излишним, потому что дети абстрактного будут «наследовать» интерфейс, потому что они расширяют абстрактный класс.
2) Учитывая, что абстрактный класс реализует части интерфейса, должен ли он также объявлять абстрактные методы для методов, которые он не реализует? Мне кажется, что это правильно, но в некотором роде это кажется излишним, потому что дети абстрактного должны будут реализовать эти методы для компиляции.
Итак, каковы ваши аргументы в пользу лучшей практики? Вопрос сводится к следующему: у нас есть интерфейс, который определяет, что мы хотим от некоторых классов, у нас есть подмножество методов в интерфейсе, которые определяют общее поведение, и у нас есть несколько разных способов определить не общее поведение. Каков наилучший способ изложить это?
+1, добавлю, что если бы я лично увидел конкретный класс, который реализовал Foo, а также расширенный AbstractFoo, мой первый инстинкт был бы в том, что Foo и AbstractFoo могут даже не быть связанными. Увеличьте путаницу, поскольку имена становятся менее очевидными. – PSpeed
интерфейсы не предназначены для развития и изменения ... – TofuBeer
Программа развивается (поскольку вы добавляете новую функциональность, исправляете ошибки, что угодно), что приводит к изменениям в базовых артефактах (классах, интерфейсах, методах, ...). Например, вы можете решить, что для метода нужен дополнительный параметр, поэтому вам нужно изменить его подпись в объявляющем интерфейсе. –