看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《loveme00835 (最愛朴素妍)》之銘言: : 另外推文中 legnaleurc 大的方法, 我想實作起來應該像這樣: : http://codepad.org/3aA7eVmi 我想我一定是太閒了, 但其實 functor 可以有更自由, 呃, 瘋狂地自由度: https://gist.github.com/619053 這裡只展示攻擊函式的定義 ... 誰說它一定得是角色的附屬品呢? 因此我把它定義在外面: typedef void AttackFunction( Character & ); typedef std::function< AttackFunction > AttackFunctor; 然後我們的角色會有一個制式的攻擊動作: void Character::attack( Character & target ) { this->attack_( target ); // AttackFunctor Character::attack_ } 呃, 好了, 現在只要是符合 void ( Character & ) 這個簽名的 **任何可呼叫體** 都可以丟進去, 上例中 fistAttack 是一個普通的函式, 被當成函式指標丟進去 MeleeWeapon 生成一個可呼叫的物件, 被當成 functor 丟進去 Bow 是一個繼承自 Missile 的多型類別, 它的虛擬成員函式被 std::bind 合成之後, 一樣當成 functor 丟進去 (注意 std::bind 直接吃 pointer to member function 和 std::shared_ptr, 它不需要額外的轉換, 噢, 我提取的還是父類別的指標, 但它依然展現了多型) 這暗示了什麼? 只要你提供的動作可以接受一個 Character & 並回傳值是 void 它甚至不需要來自同一個繼承體系, 不管它多詭異, 只要你用 std::bind 組得起來, 你就可以合法地運用它 這很大的抽離了繼承帶來的相依性, 也算是 Strategy pattern 的本意: 它其實不在意你有沒有繼承體系, 只要你在不同的 context 中可以使用 不同策略, 就是策略模式 -- 自High筆記(半荒廢) http://legnaleurc.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.104.125.67
loveme00835:推一個 :) 我有想到您可能是指這個方法 XD 01/20 16:58
loveme00835:不過考量到 friend 的問題... @_@ 01/20 17:00
legnaleurc:friend 就要看封裝的方式啦 ... 我是認為不會造成太大 01/20 17:04
legnaleurc:問題, 就算是繼承, 擴充時還是要 protected, 甚至是 01/20 17:04
legnaleurc:public ... 什麼都包成 private 會很難再擴充 01/20 17:06
loveme00835:嗯嗯 01/20 17:12