2011-09-28 89 views
2
$P1 = new Player(array(
    'name' => 'Player 1', 
    'strat' => new Strategy(&$this) 
)); 

這或多或少是我想要做的事。對$的引用顯然是錯誤的。完成這樣的事情的最好方法是什麼?傳遞對象到新對象

基本上,新的戰略目標需要知道球員它屬於什麼。

當然,我可以做這樣的:

$P1 = new Player(); 
$P1->strat = new Strategy(&P1); 

但似乎並沒有精簡。

更新:

我想,而不是通過新的戰略對象數組中,我會通過策略類的名稱,而不是,然後實例在玩家構造一個新的對象。

+0

我同意將策略類的名稱傳遞給構造函數。根據你對唐·科比的解決方案的評論,它最有意義。 – Sonny

回答

3
$P1->strat->owner =$P1; 

這樣就足夠了。


對話已開啓。
好吧,如果我們接觸,從理論和概念的角度來看這個問題,我們可以解決在幾個不同的方式隱含的問題。讓我們來看看球員的戰略是什麼。顧名思義,策略基本上是一個驅動因素,可能會影響遊戲在特定環境中的行爲。這進一步表明,以下做法將使意義:

$player->useStrategy($strategy); 

此外,玩家最有可能是在給定的範圍內行事,那麼,它將使用$戰略目標作爲控制器,並會通過從輸入任何戰略行爲控制者滿足條件。那麼,考慮到玩家可以:
1)幫助確定要進行的活動
2)使用玩家界面來響應戰略行爲必須應用的任何動作。現在

,我們可以假設,可能有不同的策略,也可以很容易地應用到任何球員,因爲該策略類實現戰略界面。在這種情況下,Strategy不需要知道關於玩家的任何信息。如果只是,有不同類型的球員有不同的界面,可以允許不同的控制組合。但是在這種情況下,爲特定玩家類設置擴展類來實現這些玩家提供的額外功能將更爲明智。

class Strategy { 
    private $player; 
    public usePlayer($player){ 
     $this->player = $player; 
    } 
    public makeNextMove($input){ 
     1) return array($a,$b); 
     2) return new Behavior_NextMove()->setTarget($a,$b); 
     3) $this->player->move($a, $b); 
    } 
} 

class Strategy_MegaPlayer extends Strategy { 
    public makeNextMove($input){ 
     parent::makeNextMove($input); 
     $player->useMegaPlayerSpecialPower(); 
    } 
} 

另外,也可以集中戰略目標,其中,通過配置接口的基礎上,玩家將決定適當的行動和戰略的類型,無論是根據玩家類型和配置它的。

但似乎結構合理的戰略性支持類,你最受益。

2

應該使用getter/setter方法:

$strategy = new Strategy(); 
$player = new Player('Player 1', $strategy); 
$strategy->setPlayer($player); 

使用符號(&)前綴是不必要的,因爲對象通過引用傳遞。

+0

我得到了一個downvote沒有解釋。不太好。 – Sonny

1

您可以讓Player構造函數將$this傳遞給通過調用Strategy上的setter傳入的Strategy對象。

但是,您可能要重新考慮Strategy對象是否真的需要指向Player對象或者是否Player對象真正需要指向Strategy對象。如果這兩個類緊密耦合,這是一種代碼味道。也許某些功能需要從一個移到另一個。

+0

「代碼氣味」上的+1 – Sonny

+0

策略是用戶可以提供的類。玩家類對策略類中的功能起作用。 (我在寫一個模擬器)。我認爲讓他們分開是有道理的。策略類需要知道一些玩家的信息,然後做出決定。 –

+0

@ChrisG。你最好了解自己的代碼,但是將單個細節傳遞給策略的決策方法,而不是持有對整個'Player'對象的引用可能會更好。它幾乎肯定會讓戰略類更容易測試。 –