條款35 考慮virtual函式以外的其他選擇

2021-10-01 14:27:20 字數 1129 閱讀 4086

大多時候,我們會自然而然的想到使用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...