Меня интересует, как можно правильно выполнить следующее без использования наследования:
Я хотел бы сделать звонок в моем приложении, как это:
// I don't want to do this:
// $temp = new Sedan;
// $myCar = new Car($temp);
// $myCar->paint();
// nor this:
// $myCar = new Car(new Sedan);
// $myCar->paint();
// Instead I want this:
$myCar = new Sedan;
$myCar->paint();
Метод рисования фактически является частью класса Car:
class Car {
private $carToPaintOn; // <-- Instance of Sedan would be stored here
public function __construct(CarInterface $car){
$this->carToPaintOn = $car;
}
public function paint(){
// paint some car
}
}
Что бы класс Sedan
(или же Coupe
или же Convertable
или тд …) как выглядит без использования наследования?
Код класса должен использовать стандартные шаблоны проектирования и следовать рекомендациям по чистому и тестируемому коду. Также, пожалуйста, избегайте дублирования paint
метод, добавив его в седан.
РЕДАКТИРОВАТЬОглядываясь назад, я должен был назвать класс «Car» как-то еще и дать ему интерфейс под названием «Paintable», чтобы лучше понять суть.
Это должно быть наследством, так как Седан ЕСТЬ Автомобиль, но Седан НЕ ИМЕЕТ Автомобиля, но если Вы действительно хотели избежать этого …
class Sedan implements CarInterface {
private $car;
public function __construct() {
$this->car = new Car($this);
}
function __call($method_name, $args) {
if (!method_exists($this, $method_name)) {
return call_user_func_array(array($this->car, $method_name), $args);
}
}
}
Этот пример является идеальным примером для наследования. Следующий код будет делать именно то, что вы сказали, что хотите сделать. Там нет необходимости черт или вводить что-то здесь. DEMO
<?php
class Car {
public function paint () {
echo " ________ \n";
echo "/ \__\n";
echo "|___________\\\n";
echo " O O\n";
}
}
class Sedan extends Car {
}
$sedan = new Sedan;
$sedan->paint();