這裏是我會怎麼做這個骨架例如:
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);
}
}
末的執行腳本打算執行相同的任務每輛車的不同取決於方法爲每個類實現。飛機和汽車都採用相同的方法,它們都繼承了相同的方法,但飛機必須首先降落。
正在執行的腳本會通過檢查它是否是特定接口的實例來檢測支持哪些方法。
例如,在實踐中,Symfony2類Command
有一個變體,稱爲ContainerAwareCommand
。通過擴展它,框架知道注入服務容器,因爲支持的方法是由子類繼承或實現的。
請顯示警告消息,因爲您目前的代碼是正確的。 –
這不是一種反模式,因此父方法需要被覆蓋嗎? http://en.wikipedia.org/wiki/Call_super – Flosculus
常識 - 沒有。因爲你無法從外部範圍預測內部方法發生了什麼。如果它是_you_誰正在設計你的孩子班 - 那麼爲什麼不直接添加直接檢查?如果不是你 - 那麼你應該添加一些問題 –