2015-01-09 114 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()方法)

你不需要去猜測什麼屬性名參與或什麼結構傳遞的對象有。