tag:blogger.com,1999:blog-36547168.post9040254976741486335..comments2023-11-25T11:00:42.257+01:00Comments on Invisible to the eye: SOLID part 3: Liskov Substitution PrincipleGiorgiohttp://www.blogger.com/profile/03558287012747987157noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-36547168.post-58867212683409527772013-09-26T13:21:53.850+02:002013-09-26T13:21:53.850+02:00abstract class Vehicle
{
private $service;
publi...abstract class Vehicle<br />{<br /> private $service;<br /> public $engine;<br /><br /> public function __construct(Service $service, $params=array())<br /> {<br /> $this->service = $service;<br /><br /> foreach($params as $name => $param) {<br /> $this->$name = $param;<br /> }<br /> }<br /><br /> protected function getService()<br /> {<br /> return $this->service;<br /> }<br /><br /> public function repair()<br /> {<br /> return $this->service->repairVehicle($this);<br /> }<br />}<br /><br />abstract class Service<br />{<br /> protected $modelClass = 'Model';<br /><br /> public function createModel($params)<br /> {<br /> $modelClass = $this->modelClass;<br /> return new $modelClass($this, $params);<br /> }<br /><br /> public function repairVehicle(Vehicle $vehicle)<br /> {<br /> $repaired = true;<br /> if(!$this->checkPart($vehicle->engine)) {<br /> $repaired |= $this->repairPart($vehicle->engine);<br /> }<br /><br /> //Do Repairs and then return<br /> return $repaired;<br /> }<br /><br /> protected function checkPart(VehiclePart $part)<br /> {<br /> return $part->ok;<br /> }<br /><br /> protected function repairPart(VehiclePart $part)<br /> {<br /> $part->ok = true;<br /> return true;<br /> }<br /><br />}<br /><br />class VehiclePart<br />{<br /> public $type;<br /> public $ok;<br />}<br /><br />class Motorcycle extends Vehicle<br />{<br /> public $wheel1;<br /> public $wheel2;<br />}<br /><br />class MotorcycleService extends Service<br />{<br /> protected $modelClass = 'Motorcycle';<br /><br /> public function repairVehicle(Motorcycle $model)<br /> {<br /> $repaired = parent::repairVehicle($model);<br /><br /> if(!$this->checkPart($model->wheel1)) {<br /> $repaired |= $this->repairPart($model->wheel1);<br /> }<br /><br /> if(!$this->checkPart($model->wheel2)) {<br /> $repaired |= $this->repairPart($model->wheel2);<br /> }<br /><br /> return $repaired;<br /> }<br />}<br /><br />//LISKOV feels violated...@chozillanoreply@blogger.com