oop — Подпись интерфейса переопределения PHP в дочернем классе

У меня есть следующий интерфейс / классы:

class Part {}
class Engine extends Part{}

interface CarsInterface {
public function selectTimeLine(Part $object);
}

abstract class Car implements CarsInterface {}

class Hybrid extends Car {
public function selectTimeLine(Engine $object) {}
}

Почему я не могу использовать объект Engine в дочерней подписи (Hybrid Class), если Engine является подклассом «Part» (я знаю, что это возможно в Java …)

Как правильно добиться этой функциональности в PHP?
Спасибо

1

Решение

Да, PHP это отстой. знак равно

Если я не ошибаюсь, вам нужно что-то вроде:

interface SomeInterface {
}

class Part implements SomeInterface  {}
class Engine extends Part implements SomeInterface{}

interface CarsInterface {
public function selectTimeLine(SomeInterface $object);
}

abstract class Car implements CarsInterface {}

class Hybrid extends Car {
public function selectTimeLine(SomeInterface $object) {}
}
3

Другие решения

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

Не существует «правильного» способа достичь того, что вы хотите сделать, но предлагаемый метод заключается в подсказке типа с интерфейсами, в отличие от конкретных определений классов.

Таким образом, вы всегда можете гарантировать доступные методы для предоставленных объектов.

interface TimeLineInterface { }

class Part implements TimeLineInterface { }

class Engine extends Part { }

interface CarInterface
{
public function selectTimeLine(TimeLineInterface $object);
}

abstract class Car implements CarInterface { }

class Hybrid extends Car
{
public function selectTimeLine(TimeLineInterface $object) { }
}

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

class Hybrid extends Car
{
public function selectTimeLine(TimeLineInterface $object)
{
if (!$object instanceof Engine) {
throw new \InvalidArgumentException(__CLASS__ . '::' . __FUNCTION__ . ' expects an instance of Engine. Received ' . get_class($object));
}
}
}
1

По вопросам рекламы [email protected]