大多時候,我們會自然而然的想到使用virtual手法來塑模現實中的類。但是,實際上也有別的方案可以替代virtual手法的,即:考慮virtual函式以外的其他選擇。下面介紹的便是幾種可以替代virtual的方案。
(1)non-virtual inte***ce 是template method 設計模式的乙個獨特的表現形式。
class
gamecharacter
private
://2、派生類可以改變的演算法細節
virtual
intdohealthvalue()
const
//derived class 可以重新定義它。
};
(2)這裡把non-virtual的函式 healthvalue()稱為dohealthvalue()函式的外覆器。
這個實現方法的優點:可以在核心點前做準備工作,和核心點後做善後工作。
(3)關於對派生類物件中重新定義 private virtual函式的擔心
(4)virtual函式的訪問控制
注意:準備工作可以是:鎖定互斥器、驗證class約束條件、驗證函式先決條件等等。善後工作可以是:解除互斥器鎖定、驗證函式的事後條件、再次驗證class約束條件等等。
(1)具體做法
在遊戲角色類中新增乙個指標,指向乙個計算健康指數的函式。
(2)優點
通過funtion pointers完成strategy與使用virtual函式實現的比較:
(1)實現方法:
上面的方法是讓遊戲角色類擁有乙個指向函式的指標。而這個方案是讓遊戲角色類擁有乙個像函式一樣的函式物件。
(2)優點:(1)傳統的strategy的做法是:
(2)優點:(1)實現方案存在的問題
實際上也就是說,健康指數計算函式不再是遊戲角色類的成員函式了,這也意味著他們不能直接訪問遊戲角色類的成員了。
(2)解決上述問題的方法:
弱化遊戲角色類的封裝,這也是這種替代方案的缺點,這是下面strategy設計模式都要需要面臨的問題。
方案一:遊戲角色類可以將該函式宣告為友元。
方案二:將遊戲角色類的某些成員宣告為public。
(3)三種方案的缺點
弱化了封裝。
條款35 考慮虛函式以外的其他選擇
我們考慮下面這個問題 假設我們在開發一款遊戲,遊戲中有不同的角色,每個角色有自己的生命值的初始值,生命值的計算方法等等。你會怎麼設計這個類呢?我們很自然的就會想到 class gamecharacter 就是說基類裡定義了乙個計算生命值的函式,派生類通過重新定義這個函式來完成不同型別的角色的生命值的...
考慮Virtual函式以外的其他選擇
方法一,基於虛函式的方法 在人物角色的基類增加乙個成員函式heathvalue,返回乙個整數,表示人物的健康程度,並將宣告為virtual 1 class gamecharacter heathvalue宣告為虛函式,因而派生類可以重新定義它,從而獲得達到不同的人物可能不同的方式計算他們的健康指數的...
考慮virtual函式以外的其它選擇
詳情見 effective c item35 1.使用non virtual inte ce nvi 手法,這是template method設計模式的一種特殊形式。它以public non virtual成員函式包裹較低訪問性 private 或 protected 的virtual函式。2.st...