Совершенно нормально использовать эти два вместе. Рассмотрим, например, AbstractList
(с использованием List
) и AbstractMap
(реализация Map
) в JDK.
Моей реакция рефлекторной бы иметь абстрактный класс реализует интерфейс, а затем конкретные классы происходят из него:
abstract class Base implements TheInterface {
/* ...shared methods... */
}
class Concrete1 extends Base { }
class Concrete1 extends Base { }
Но ваш вопрос поднимая другую возможность заставил меня думать, и я не может видеть большую часть аргумента против делать это таким образом:
abstract class Base {
/* ...shared methods... */
}
class Concrete1 extends Base implements TheInterface { }
class Concrete1 extends Base implements TheInterface { }
Кроме того, я могу увидеть аргумент для делать это таким образом, в частности, что она удаляет связь между абстрактным с ласс и интерфейс. Если у вас есть другой класс, которому нужна функциональность Base
, но не необходимо реализовать интерфейс, у вас есть возможность сделать это.
Существует также третий вариант: Состав. Вы не могли бы иметь абстрактный класс вообще, а есть несколько конкретных классов, которые реализуют интерфейс использования общий вспомогательный класс в их реализации:
class Helper {
/* ...shared methods... */
}
class Concrete1 implements TheInterface {
/* ...uses instance of Helper */
}
class Concrete1 implements TheInterface {
/* ...uses instance of Helper */
}
Это имеет ту же гибкость, и в другой форме.
Нет причин, по которым они не должны быть –
Nop, совсем нет. На деле большая часть того, что я делаю, точно такая. –