すぐにインターフェイスまたは抽象を想定する人もいると思いますが、それでは一部の状況しか処理できません。これは、それらが壊れる例です。
同じインターフェースを実装し、同じベースを拡張するクラスがあるとします。
class car extends fourwheeler implements ipaygas{
protected $tank1;
//interface
public function payGas($amount){}
}
class sportscar extends fourwheeler implements ipaygas{
protected $tank1;
protected $tank2;
//interface
public function payGas($amount){}
}
interface ipaygas{
function payGas($amount);
}
'payGas()' だけを実行したい場合があるため、インターフェースだけで十分な場合もあります。しかし、満たさなければならない条件がある場合、あなたはどうしますか。
たとえば、ガソリンを支払う前に、(1) 車の種類を確認し、(2) スポーツ カーにプレミアム ガソリンを使用し、(3) スポーツ カーの 2 番目のタンクを満タンにする必要があるとします。
これは私がやりたいことですが、できません
function pumpAndPay(iPayGas $car){
if(gettype($car) == "car"){
fillTank($car,(car) $car->tank1);
}else{
fillTank($car,(sportscar) $car->tank1);
fillTank($car,(sportscar) $car->tank2);
}
}
実際の型キャストでこれを行うにはどうすればよいですか? PHPで可能ですか?
更新(回答に基づく):私の「実際の」ケースでは...さまざまな車両タイプを確認する必要があると想像してください。それぞれに異なるペイント、ボディ、インテリア、gas_type、cleaner_type、colorなどがあります...
abstract class AVechicle{}
abstract class ACar extends AVechicle{}
abstract class ATruckOrSUV extends AVechicle{}
abstract class ABike extends AVechicle{}
class Car extends ACar{}
class SportsCar extends ACar{}
class SUV extends ATruckOrSUV{}
class Truck extends ATruckOrSUV{}
class Bike extends ABike{}
class Scooter extends ABike{}
class GasStation{
public function cleanVehicle(AVehicle $car){
//assume we need to check the car type to know
//what type of cleaner to use and how to clean the car
//if the car has leather or bucket seats
//imagine we have to add an extra $2/h for sports cars
//imagine a truck needs special treatment tires
//or needs inspection
}
public function pumpAndPay(AVehicle $car){
//need to know vehicle type to get gas type
//maybe we have a special for scooters only, Green Air campaign etc.
}
public function fullService(AVehicle $car){
//need to know if its a truck to do inspection FIRST
$this->cleanVehicle($car);
$this->pumpAndPay($car);
//bikes get 10% off
//cars get free carwash
}
}
インターフェースとアブストラクトだけでは、これまでのところしか機能しません...