我如何避免继承并仍然让它看起来好像我在调用一个 class?

How do I avoid inheritance and still make it look as though I'm calling one class?

我对如何在不使用继承的情况下正确完成以下操作感兴趣:

我想在我的应用中像这样拨打电话:

// 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();

paint方法实际上是class汽车的一部分:

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
    }
}

如果不使用继承,class Sedan(或 CoupeConvertable 等等)会是什么样子? class 代码必须使用行业标准设计模式,并遵循清洁和可测试代码的准则。另外请避免重复 paint 方法,将其额外添加到 Sedan。

编辑:事后看来,我应该将 class "Car" 命名为其他名称,并给它一个名为 "Paintable" 的接口以更好地明白重点。

这应该是继承,因为 Sedan IS A car,但 Sedan does not HAVE A car,但如果你真的想避免它...

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();