0

我正在尝试设计一些需要使用外部对象的类。外部对象来自第三方库。伪代码中的示例

Class A {
    protected $foo

    public function __construct(\ThirdParty\Foo $foo) {
        $this->foo = $foo
    }
}

创建这些子类是为了保存根据 Foo 的实例化方式而具有略微不同实现的方法。

Class AA extends A {
    $fooInfo = 'red'
    public function __construct($foo) {
        parent::__construct($foo)
    }
    public function get() {
        return $this->foo->getTypeX();
    }
}

Class AB extends A {
    $fooInfo = 'white'
    public function __construct($foo) {
        parent::__construct($foo)
    }
    public function get() {
        return $this->foo->getTypeY();
    }
}

但是要使用第三方应用程序,我在实例化它时需要 $fooInfo 中的值。

$clientRed = new Foo('red')
$clientWhite = new Foo('white')

那么当我实例化 AA 或 AB 时,我如何将颜色信息获取到 Foo 对象?

$client = new AA(new Foo(????))
4

2 回答 2

1
class AA extends A {
  const fooInfo = 'red'
  ...

$client = new AA(new Foo(AA::fooInfo))

您还可以创建工厂:

function CreateClient ($clientType) {
    return new $clientType(new Foo($clientType::fooInfo))
}

$client = CreateClient('AA')
于 2013-06-05T16:18:55.607 回答
0

使用工厂为您实例化对象。

像这样:

class ClientFactory {
    public function getClient($objectType){
        switch(objectType) {
           case 'AA':
              $fooInfo = 'red';
              break;
           case 'AB':
              $fooInfo = 'white';
              break;
        }
        $foo = new Foo($fooInfo);
        return new $objectType($foo);
    }
}

您的客户现在不需要知道所Foo创建的类的任何信息。它只知道它有一个。如果类的要求发生变化(AB 现在也需要一个“红色”Foo),您可以在一个位置进行更改。

于 2013-06-05T16:14:08.300 回答