Php 如何避免继承并使其看起来像我';我在叫一门课?
我感兴趣的是如何在不使用继承的情况下正确完成以下操作: 我想在我的应用程序中拨打如下电话:Php 如何避免继承并使其看起来像我';我在叫一门课?,php,inheritance,design-patterns,composition,php-5.5,Php,Inheritance,Design Patterns,Composition,Php 5.5,我感兴趣的是如何在不使用继承的情况下正确完成以下操作: 我想在我的应用程序中拨打如下电话: // 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 =
// 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
}
}
等级车{
private$carToPaintOn;//carToPaintOn=$car;
}
公共功能涂料(){
//给汽车上油漆
}
}
如果不使用继承,classSedan
(或Coupe
或Convertable
或诸如此类)会是什么样子?
类代码必须使用行业标准设计模式,并遵循干净和可测试代码的指导原则。另外,请避免将喷漆
方法添加到轿车中,以避免重复该方法
编辑:事后看来,我应该将类命名为“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);
}
}
}
这个例子是继承的完美例子。下面的代码将完全执行您所说的操作。这里不需要特征或注射什么东西
你的教授不想让我们回答你的家庭作业。看看我的个人资料,我不在大学里-但是我正试图解决我和其他人的一次讨论(如果你必须知道的话)哈!不可能。您不能实例化一个Sedan
对象并让它返回一个Car
对象。为了更接近,您可以将工厂模式和委托模式结合起来。但即使这样也不能满足您的所有要求,例如间接实例化和自动依赖注入。孩子们,请不要在家里这样做。我知道,我只是认为汽车很容易思考,也想不出另一个简单的主题(我所有的例子都指向复杂性)。哇!好的,这与我想的解决方案非常接近,但是我已经把构造函数和_调用都放到了一个traits中,所以我想,如果我想以这种方式调用Sedan
,只需要包含这个特性。否则,我可以使用典型的装饰调用方法。?这就像是装饰的反面。我叫它室内装潢师。这是可以接受的做法吗?(例如,组合重于继承等等)这有一个名字:委托。这个例子的目的是展示如何在不使用继承的情况下正确地完成它。我听说高级开发人员说他们已经好几年没有使用继承了@戴维德格拉汉姆:这是可以做到的,但“适当”不适合这里。
<?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();