Как мне избежать наследования и при этом сделать так, как будто я вызываю один класс?

Меня интересует, как можно правильно выполнить следующее без использования наследования:

Я хотел бы сделать звонок в моем приложении, как это:

// 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», чтобы лучше понять суть.

1

Решение

Это должно быть наследством, так как Седан ЕСТЬ Автомобиль, но Седан НЕ ИМЕЕТ Автомобиля, но если Вы действительно хотели избежать этого …

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);
}
}
}
2

Другие решения

Этот пример является идеальным примером для наследования. Следующий код будет делать именно то, что вы сказали, что хотите сделать. Там нет необходимости черт или вводить что-то здесь. 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();
1

По вопросам рекламы [email protected]