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