Интерфейсы
Интерфейс - это контракт, определяющий, как взаимодействовать с объектом.Они полезны для выражения того, как ваши внутренние объекты намерены взаимодействовать с объектом.После Инверсия зависимости ваш публичный API будет иметь все параметры, выраженные через интерфейсы.Вам все равно, как он делает то, что вам нужно, просто он делает именно то, что вам нужно.
Пример: Вам может просто понадобиться Vehicle
длятранспортировать товары, вас не волнует конкретный вид транспорта.
Наследование
Наследование является продолжением конкретной реализации.Эта реализация может удовлетворять или не удовлетворять конкретному интерфейсу.Вы должны ожидать предка конкретной реализации только тогда, когда вам небезразлично, как.
Пример: Возможно, вам потребуется Plane
реализация автомобиля для быстрой транспортировки.
Композиция
Композиция может использоваться как альтернатива наследования.Вместо вашего класса, расширяющего базовый класс, он создается с объектами, которые реализуют меньшие части ответственности основного класса.Композиция используется в facade pattern
и decorator pattern
.
Пример: Вы можете создать класс DuckBoat
( DUKW ), который реализует LandVehicle
иWaterVehicle
, которые оба реализуют Vehicle
, состоящий из Truck
и Boat
реализаций.
Ответы
Q1.Поскольку интерфейсы имеют только абстрактные методы (без кода), как мы можем сказать, что если мы реализуем какой-либо интерфейс, то это наследование?Мы не используем его код.
Интерфейсы не наследуются.Реализация интерфейса выражает намерение вашего класса работать так, как это определено интерфейсом.Наследование - это когда у вас общий предок, и вы получаете такое же поведение (inherit
), что и предок, поэтому вам не нужно его определять.
Q2.Если реализация интерфейса не является наследованием, то как интерфейсы используются для достижения множественного наследования?
Интерфейсы не достигают множественного наследования.Они выражают, что класс может подходить для нескольких ролей.
Q3.В любом случае, какова польза от использования интерфейсов?У них нет никакого кода.Нам нужно писать код снова и снова во всех классах, которые мы его реализуем.
Одним из основных преимуществ интерфейсов является разделение задач:
- Вы можете написатькласс, который делает что-то с другим классом, не заботясь о том, как этот класс реализован.
- Любая будущая разработка может быть совместима с вашей реализацией без необходимости расширения конкретного базового класса.
InВ духе DRY
вы можете написать реализацию, которая удовлетворяет интерфейсу, и изменить его, сохраняя при этом open/closed principal
, если вы используете композицию.