PHP: как иметь расширенный интерфейс для класса, который наследуется от другого класса со своим собственным интерфейсом?

#php #inheritance #interface

#php #наследование #интерфейс

Вопрос:

У меня есть что-то вроде :

 interface IProduct { }
class Product implements IProduct { }
class SpecificProduct extends Product { }
  

Мне нужно иметь интерфейс, который расширяет IProduct, для моего конкретного продукта.
Могу ли я просто сделать что-то вроде :

 interface ISpecificProduct { }
class SpecificProduct extends Product implements ISpecificProduct { }
  

или это перезапишет интерфейс IProduct ?

Ответ №1:

Это работает в PHP, таким образом, просто пройдите:

class SpecificProduct как extends Product это implements IProduct уже было. Также implements ISpecificProduct у него есть оба интерфейса.

SpecificProduct теперь имеет два интерфейса, тогда:

  1. IProduct
  2. ISpecificProduct

Ответ №2:

Да, вы можете это сделать, и нет, это не «перезапишет» IProduct , это дополнит его.

В случае, если вы где-то используете ISpecificProduct интерфейс и хотели бы узнать о методах в IProduct , ISpecificProduct также можете расширить IProduct :

 interface ISpecificProduct extends IProduct
  

В этом случае SpecificProduct получает информацию о сигнатурах методов от IProduct двумя способами.

Смотрите документацию PHP по интерфейсам для получения дополнительной информации.


В качестве дополнительного примечания, если у вас есть соответствующий интерфейс для каждого конкретного класса, вероятно, в вашем дизайне объекта происходит что-то неэффективное или ненужное.

Комментарии:

1. Что плохого, если каждый класс реализует интерфейс?

2. @hakre Это не то, что я сказал, плохо — плохо то, что у каждого интерфейса есть только одна реализация, и для каждой реализации требуется интерфейс. От такого дизайна просто нет никакой пользы.

3. Я просто спросил, так что спасибо за ваш отзыв. В тестах часто встречаются поддельные объекты, которые могут извлечь большую выгоду из интерфейсов, даже если базовый код имеет только один класс для каждого интерфейса (сначала). Так что, возможно, это то, что следует учитывать.

4. @hakre Хороший момент, в этом случае, я полагаю, у вас будет две реализации, даже если одна только в тестировании, а не в производстве.