#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
теперь имеет два интерфейса, тогда:
IProduct
ISpecificProduct
Ответ №2:
Да, вы можете это сделать, и нет, это не «перезапишет» IProduct
, это дополнит его.
В случае, если вы где-то используете ISpecificProduct
интерфейс и хотели бы узнать о методах в IProduct
, ISpecificProduct
также можете расширить IProduct
:
interface ISpecificProduct extends IProduct
В этом случае SpecificProduct
получает информацию о сигнатурах методов от IProduct
двумя способами.
Смотрите документацию PHP по интерфейсам для получения дополнительной информации.
В качестве дополнительного примечания, если у вас есть соответствующий интерфейс для каждого конкретного класса, вероятно, в вашем дизайне объекта происходит что-то неэффективное или ненужное.
Комментарии:
1. Что плохого, если каждый класс реализует интерфейс?
2. @hakre Это не то, что я сказал, плохо — плохо то, что у каждого интерфейса есть только одна реализация, и для каждой реализации требуется интерфейс. От такого дизайна просто нет никакой пользы.
3. Я просто спросил, так что спасибо за ваш отзыв. В тестах часто встречаются поддельные объекты, которые могут извлечь большую выгоду из интерфейсов, даже если базовый код имеет только один класс для каждого интерфейса (сначала). Так что, возможно, это то, что следует учитывать.
4. @hakre Хороший момент, в этом случае, я полагаю, у вас будет две реализации, даже если одна только в тестировании, а не в производстве.