0

我有一些标准课程:

abstract class Parent {}
class Child1 extends Parent {}
class Child2 extends Parent {}

该类Parent包含两个子类共有的逻辑,但每个子类都有自己的附加逻辑。

对于我的每个客户,这个逻辑都是可以配置的。所以对于任何特定的客户,我可能有:

abstract class ClientParent {}
class ClientChild1 extends ClientParent {}
class ClientChild2 extends ClientParent {}

我遇到的问题是如何将标准类中的逻辑放入这些类中。第一种方法是这样的:

abstract class ClientParent extends Parent {}

好的,现在我在所有特定于客户端的类中都有标准的父逻辑。伟大的。但是子类已经在扩展ClientParent,所以我们不能为它们做同样的事情。我的“解决方案”就是这样做:

abstract class Parent {}
class Child1 extends ClientParent {}
class Child2 extends ClientParent {}

abstract class ClientParent extends Parent {}
class ClientChild1 extends Child1 {}
class ClientChild2 extends Child2 {}

那里; 现在所有适当的逻辑都被传递下来,每个人都很高兴。除了现在我的标准类耦合到特定的客户端。由于我有很多客户,这显然不好。

我这里有什么?有没有办法单独通过继承来解决这个问题,或者我应该研究更复杂的配置注入策略?

编辑:

我使用的是 PHP 5.3,所以我无法使用特征来解决这个问题。

4

1 回答 1

1

PHP 不支持多重继承,这是我认为您在此处试图近似的。然而,它确实支持(从 5.4 开始)特征,在许多情况下可以为您提供类似的功能。

trait ParentTrait {
   public function someUsefulMethod(){/*...*/};
   public function someOtherUsefulMethod(){/*...*/};
}

abstract class ClientParent(){}

class ClientChild1 extends ClientParent {
      use ParentTrait;
}

$clientChild1 = new ClientChild1();
$clientChild1->someUsefulMethod();

另一种选择是改用组合,可能对于您的问题,使用策略模式会起作用。

class SuperWidget extends Widget{
    private $dataStrategy;

    public function __construct(DataStrategy $strategy){
         $this->dataStrategy = $strategy;
    }

    // do this if you need to expose the functionality. 
    public function getData(){
        return $this->dataStrategy->getData();
    }

    // or if you are just using it in your class
    public function renderWidget($option){
        $data = $this->dataStrategy->getData($option);
        // use the data to render the widget;
        return $renderedWidget;
    }
}

$dataStrategy = JsonDataStrategy("http://data.source.url/jsonService.php");
$widget = new SuperWidget($dataStrategy);
于 2013-09-18T15:57:18.977 回答