2015-01-09 72 views
0

设计pattery策略我想用PHP来实现战略设计模式:能够访问父

interface dummy_function { 
    public function render(); 
} 

class a implements dummy_function { 
    public function render() { 
     echo "class a\n"; 
     // I want to acess x_main::dummy like: echo parent::dummy 
    } 
} 

class b implements dummy_function { 
    public function render() { 
     echo "class b\n"; 
     // I want to acess x_main::dummy like: echo parent::dummy 
    } 
} 

class x_main { 

    public $dummy = "hello world"; 

    public function setX_Function(dummy_function $funcname) { 
     $this->x_function = $funcname; 
    } 

    public function render() { 
     $this->x_function->render(); 
    } 
} 


$test = new x_main(); 
$test->setX_Function(new a()); 
$test->render(); 

我的课我要访问一些方法,并在主类中定义的变量里面。不幸的是,“parent”不能访问实现类中的类“x_main”的内容。

一种方法,我发现是给$以此为参数的方法“渲染”,如:

class x_main { 
    [...] 
    public function render() { 
     $this->x_function->render($this); 
    } 
} 

class a implements dummy_function { 
    public function render($mainclass) { 
     echo "class a\n"; 
     echo $mainclass->dummy; 
    } 
} 

下一个办法,我testest是从类主要direcly设置可变进实施的功能,如:

class x_main { 

    [ ... ]  
    public function setX_Function(dummy_function $funcname) { 
     $this->x_function = $funcname; 
     $this->x_function->dummy = $dummy; 
    } 

} 

class a implements dummy_function { 
    public function render() { 
     echo "class a\n"; 
     echo $this->dummy; 
    } 
} 

这两种解决方案的工作,但我觉得有点糊涂了,如果这对实现我想要的想法的最好办法。它看起来非常像解决方法,但不像真正的面向对象编程。

我期待着您的想法。

+2

为什么你的接口的实现应该知道它将如何使用(即:使用你的“主类”中的东西,这是你的情况下的使用上下文)。您的界面(合同)不正确,或者您的故障不正确。在目前的状态下,它至少破坏了demeter的法则,并导致难以维护的紧密耦合代码。 –

+1

这两个类没有任何关系,它们当然没有“父”关系。一个持有另一个对象实例的对象并不意味着这两个对象之间存在任何关系。您只需*显式*将数据传递到您的'dummy_function'实例;例如:'公共函数渲染(数组$数据)'。 – deceze

+0

@deceze:在我的第一个解决方案中,我将整个mainclass作为参数提供给渲染函数。所以这是一个可以在任何情况下工作的解决方案。但如果这两个对象之间没有明确的关系,我更喜欢我的第二个解决方案,直接用'$ this-> x_function-> dummy = $ dummy; – Marco

回答

2

换汤不换药上述评论:

两个类都不能以任何方式相关的,他们肯定没有 父母的关系。一个持有另一个对象 的实例的对象并不意味着这两个对象与 之间存在任何关系。你只需要明确地将数据传递给你的dummy_function实例;例如为:public function render(array $data).

响应:

在我的第一个解决方案,我把整个mainclass作为参数传递给 渲染功能。所以这是一个可以在任何情况下工作的解决方案。但 如果definitivly这两个对象之间没有关系我 通过设置参数直接与 $this->x_function->dummy = $dummy;

遗憾地告诉你,你错了喜欢我的第二个解决方案。在对象上隐式设置属性决不是定义的接口。而且我没有在PHP的interface关键字的意义上使用这个词,我的意思是这个广义上的指定了两段代码如何交互和合作

您已经为render()函数指定并使用interface做了很好的工作,这大大减少了代码耦合并提高了灵活性和可测试性。现在你通过使用未定义和脆弱的属性分配来再次销毁它。

您需要使将数据传入render接口规范的方面部分。例如:

interface dummy_function { 
    public function render(array $data); 
} 

或者:

interface dummy_function { 
    public function setData(array $data); 
    public function render(); 
} 

或者更好:

interface DummyData { 

    /** 
    * @return string 
    */ 
    public function getDummyData(); 

} 

interface DummyRenderer { 

    public function render(DummyData $data); 

} 

有了这个你:

  • 明确指定你的数据是什么格式( string
  • 编纂其中render()可以访问这些数据(它会收到一个DummyData对象具有getDummyData()方法)

你不需要去猜测什么属性名参与或什么结构传递的对象有。