设计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;
}
}
这两种解决方案的工作,但我觉得有点糊涂了,如果这对实现我想要的想法的最好办法。它看起来非常像解决方法,但不像真正的面向对象编程。
我期待着您的想法。
为什么你的接口的实现应该知道它将如何使用(即:使用你的“主类”中的东西,这是你的情况下的使用上下文)。您的界面(合同)不正确,或者您的故障不正确。在目前的状态下,它至少破坏了demeter的法则,并导致难以维护的紧密耦合代码。 –
这两个类没有任何关系,它们当然没有“父”关系。一个持有另一个对象实例的对象并不意味着这两个对象之间存在任何关系。您只需*显式*将数据传递到您的'dummy_function'实例;例如:'公共函数渲染(数组$数据)'。 – deceze
@deceze:在我的第一个解决方案中,我将整个mainclass作为参数提供给渲染函数。所以这是一个可以在任何情况下工作的解决方案。但如果这两个对象之间没有明确的关系,我更喜欢我的第二个解决方案,直接用'$ this-> x_function-> dummy = $ dummy; – Marco