Fw: [請益] 程式設計一問

看板C_and_CPP (C/C++)作者 (耐吉七四七三一)時間13年前 (2012/12/25 14:27), 編輯推噓2(2019)
留言21則, 10人參與, 最新討論串1/1
※ [本文轉錄自 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

12/25 15:38, , 1F
改成在Game層寫個private的函式AddPlayerHP(int val)
12/25 15:38, 1F

12/25 15:39, , 2F
然後game類宣告friend class EnemySystem
12/25 15:39, 2F

12/25 15:40, , 3F
可行否??
12/25 15:40, 3F

12/25 16:54, , 4F
跟我最近設計的架構好像 xD
12/25 16:54, 4F

12/25 18:40, , 5F
應該是Game裡面某個battle之類的function去呼叫
12/25 18:40, 5F

12/25 18:40, , 6F
player.addHP()和enemy.kill()吧
12/25 18:40, 6F

12/25 18:45, , 7F
die 函數多一個參數: enemy.die(killer); 在函數中就可以
12/25 18:45, 7F

12/25 18:46, , 8F
對 killer 做操作
12/25 18:46, 8F

12/25 19:24, , 9F
若AddHP與Kill分開呼叫 會造成邏輯上的漏洞 因為無法確
12/25 19:24, 9F

12/25 19:25, , 10F
保在任何時候都會成對執行
12/25 19:25, 10F

12/25 21:36, , 11F
記住攻擊你的對象是誰,進死亡狀態的時候再幫他補10HP。
12/25 21:36, 11F

12/26 00:06, , 12F
把要做的事和玩家包成closure 然後敵人死掉時呼叫它 (大誤
12/26 00:06, 12F

12/26 00:09, , 13F
OOAD 給的 reply 看似不錯..
12/26 00:09, 13F

12/26 01:08, , 14F
可以考慮利用繼承來達到模組間的溝通
12/26 01:08, 14F

12/26 01:11, , 15F
此例玩家系統可以有一個子類別讓敵人系統去繼承
12/26 01:11, 15F

12/26 01:12, , 16F
此子類別只提供敵人系統需要的函式呼叫
12/26 01:12, 16F

12/26 01:13, , 17F
只要在敵人系統增加一個由玩家系統實例初始化的子物件
12/26 01:13, 17F

12/26 01:13, , 18F
ㄈㄈ 繼承是用到沒招的時候才去考慮的選項
12/26 01:13, 18F

12/26 01:13, , 19F
敵人系統就可以透過繼承體系呼叫玩家系統的成員函式
12/26 01:13, 19F

12/26 01:15, , 20F
修正上面 敵人系統可以有一個子類別讓玩家系統去繼承
12/26 01:15, 20F

12/26 01:56, , 21F
解法都有人說了,你可以一邊當走迷宮的老鼠一邊試聰明解法
12/26 01:56, 21F
文章代碼(AID): #1GsKTQ8H (C_and_CPP)
文章代碼(AID): #1GsKTQ8H (C_and_CPP)