設計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