看板 C_and_CPP 關於我們 聯絡資訊
※ [本文轉錄自 OOAD 看板 #1GsKQgqV ] 作者: NIKE74731 (耐吉七四七三一) 看板: OOAD 標題: [請益] 程式設計一問 時間: Tue Dec 25 14:24:39 2012 各位好 當我們寫一個稍微大一點的類別時 通常因為功能較多 會切分成各個子系統進行操作,例如: class BigSystem { private: SystemA* m_pSysA; SystemB* m_pSysB; . . . } 既然是同一系統下的子系統 運作時當然會遇到必須使用到其它子系統的時候 例如 class Game { private: PlayerSystem* m_pPlayerSys; EnemySystem* m_pEnemySys; . . . } 以"當敵人死亡時,玩家生命值+10"為例 EnemySystem::OnKilled() { //do something //PlayerSystem.AddHP(10); } 問題就在如何執行PlayerSystem.AddHP(10)? 直觀上我們可以有以下兩個方法 1.讓EnemySystem取得PlayerSystem,進而執行PlayerSystem的各項行為 2.在Game層寫個public的函式AddPlayerHP(int val),讓EnemySystem執行 但以上兩個方案都有一個相同的問題 開放了一個對Game類別外部來說 不需使用的介面 無論是Game::GetPlayerSystem()或者Game::AddPlayerHP() 目的都是內部的操作 但卻將功能開放給外部 所以我想請問各位板友 對於這個情形來說 是否有解法? 又或者說這樣的一個子系統設計方式本身就是有問題的? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.170.186.36 ※ 編輯: NIKE74731 來自: 1.170.186.36 (12/25 14:25) ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: NIKE74731 (1.170.186.36), 時間: 12/25/2012 14:27:37
CumCumCum:改成在Game層寫個private的函式AddPlayerHP(int val) 12/25 15:38
CumCumCum:然後game類宣告friend class EnemySystem 12/25 15:39
CumCumCum:可行否?? 12/25 15:40
loveme00835:跟我最近設計的架構好像 xD 12/25 16:54
legendmtg:應該是Game裡面某個battle之類的function去呼叫 12/25 18:40
legendmtg:player.addHP()和enemy.kill()吧 12/25 18:40
stimim:die 函數多一個參數: enemy.die(killer); 在函數中就可以 12/25 18:45
stimim:對 killer 做操作 12/25 18:46
NIKE74731:若AddHP與Kill分開呼叫 會造成邏輯上的漏洞 因為無法確 12/25 19:24
NIKE74731:保在任何時候都會成對執行 12/25 19:25
linotwo:記住攻擊你的對象是誰,進死亡狀態的時候再幫他補10HP。 12/25 21:36
PkmX:把要做的事和玩家包成closure 然後敵人死掉時呼叫它 (大誤 12/26 00:06
EdisonX:OOAD 給的 reply 看似不錯.. 12/26 00:09
rodion:可以考慮利用繼承來達到模組間的溝通 12/26 01:08
rodion:此例玩家系統可以有一個子類別讓敵人系統去繼承 12/26 01:11
rodion:此子類別只提供敵人系統需要的函式呼叫 12/26 01:12
rodion:只要在敵人系統增加一個由玩家系統實例初始化的子物件 12/26 01:13
loveme00835:ㄈㄈ 繼承是用到沒招的時候才去考慮的選項 12/26 01:13
rodion:敵人系統就可以透過繼承體系呼叫玩家系統的成員函式 12/26 01:13
rodion:修正上面 敵人系統可以有一個子類別讓玩家系統去繼承 12/26 01:15
damody:解法都有人說了,你可以一邊當走迷宮的老鼠一邊試聰明解法 12/26 01:56