Вот скелет пример того, как я хотел бы сделать это:
interface VehicleInterface
{
public function move($x, $y);
public function refuel($station);
}
interface FlyableInterface
{
public function takeoff();
public function land();
}
abstract class AbstractVehicle implements VehicleInterface
{
/**
* Implementation to refuel at station
*/
public function refuel($station)
{
}
}
class Car extends AbstractVehicle
{
/**
* Implementation to move by following a road.
*/
public function move($x, $y)
{
}
}
class Plane extends AbstractVehicle implements FlyableInterface
{
/**
* Implementation to move by means of flying.
*/
public function move($x, $y)
{
}
/**
* Override of AbstractVehicle::refuel, landing required first.
*/
public function refuel($station)
{
$this->land();
parent::refuel($station);
}
/**
* Implementation for plane to take off.
*/
public function takeoff()
{
}
/**
* Implementation to land the plane.
*/
public function land()
{
}
}
$vehicles = array(new Car(), new Plane());
$x = '145';
$y = '751';
foreach($vehicles as $vehicle) {
if($vehicle instanceof FlyableInterface) {
$vehicle->takeoff();
$vehicle->move($x, $y);
$vehicle->land();
} else {
$vehicle->move($x, $y);
}
}
Исполнительное сценарий в конце намерен выполнить ту же задачу для каждого транспортного средства по-разному в зависимости от методов, каждый класс реализует. Как самолет, так и автомобиль реализуют один и тот же метод move
, и оба они наследуют один и тот же метод refuel
, однако самолет должен сначала приземлиться.
Сценарий выполнения определит, какие методы поддерживаются, проверяя, является ли это экземпляром определенного интерфейса.
Для примера на практике класс Symfony2 Command
имеет вариант, называемый ContainerAwareCommand
. Расширяя это, структура знает, чтобы ввести контейнер обслуживания, потому что поддерживаемые методы для этого либо наследуются, либо реализуются дочерним классом.
Показать предупреждение, пожалуйста, потому что ваш текущий код является правильным. –
Разве это не шаблон, в котором родительский метод должен быть переоценен? http://en.wikipedia.org/wiki/Call_super – Flosculus
В здравом смысле - нет. Потому что вы не можете предсказать, что происходит внутри метода извне. Если это _you_, кто разрабатывает ваши дочерние классы, то почему бы просто не добавить прямую проверку? Если это не вы, то вам следует добавить некоторые ограничения в вопрос –