我如何避免继承并仍然让它看起来好像我在调用一个 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
(或 Coupe
或 Convertable
等等)会是什么样子?
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();
我对如何在不使用继承的情况下正确完成以下操作感兴趣:
我想在我的应用中像这样拨打电话:
// 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
(或 Coupe
或 Convertable
等等)会是什么样子?
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();