C 考慮virtual函式以外的其他選擇

2021-09-26 02:21:21 字數 2868 閱讀 7744

方法一,基於虛函式的方法.

在人物角色的基類增加乙個成員函式heathvalue,返回乙個整數,表示人物的健康程度,並將宣告為virtual.

1

class

gamecharacter ;

heathvalue宣告為虛函式,因而派生類可以重新定義它,從而獲得達到不同的人物可能不同的方式計算他們的健康指數的要求.

但是沒有宣告為純函式,這表示會有個計算健康指數的預設演算法.

方法二,藉由non-virtual inte***ce手法實現template method模式 nvi

該設計是令客戶通過public non-virtual成員函式間接呼叫private virtual函式,相當對virtual函式進行一層的包裝,可以稱為是virtual函式的外覆器(warpper).

class

gamecharacter

...private

:

virtual

int dohealthvalue() const

};

nvi手法的乙個優點可以確保在乙個virtual函式被呼叫之前設定好適當的場景,並在呼叫結束之後清理場景.

"事前工作"可以包括鎖定互斥器,製造運轉日誌記錄項,驗證class約束條件,驗證函式先決條件等等.

"事後工作"可以包括互斥器解除鎖定,驗證函式的事後條件,再次驗證class約束條件等等.

方法三,藉由function pointers實現strategy模式

每個人物的建構函式接受乙個指標,指向乙個健康計算函式,呼叫該函式進行實際計算.

class

gamecharacter;

int defaulthealthcalc(const gamecharacter&gc);

class

gamecharacter

int healthvalue() const

...private

: healthcalcfunc healthfunc;

};

該方法的優點,同一人物型別之不同實體可以有不同的健康計算函式,只需要在構造例項時,傳入不同的計算函式的指標.

某已知人物之健康計算函式可在運動期變更,可以在gamecharacter裡提供乙個成員函式sethealthcalc,用來替換當前的健康指數計算函式.

該方法的缺點,如果需要利用gamecharacter的non-public資訊進行計算健康指數時,由於計算函式是non-member non-friend函式,將出現無法訪問的問題.

如果讓計算函式訪問成功,則需要降低gamecharacter的封裝性.

方法四,藉由tr1::function完成strategy模式

不再使用函式指標,而是改用乙個型別為tr1::function的物件.

可以是函式指標,函式物件,或成員函式指標,只要其簽名式相容於需求端.

class

gamecharacter;

int defaulthealthcalc(const gamecharacter&gc);

class

gamecharacter

int healthvalue() const

...private

: healthcalcfunc healthfunc;

};short calchealth(const gamecharacter&);

struct

healthcalculator

};class

gamelevel ;

class evilbadguy:public

gamecharacter;

evilbadguy ebg1(calchealth);

//函式

evilbadguy ebg2(healthcalculator()); //

函式物件

gamelevel currentlevel;

evilbadguy ebg3(std::tr1::bind(&gamelevel::health,currentlevel,_1); //

成員函式

優點,以tr1::function替換函式指標之後,可以允許客戶在計算人物健康指數時使用任何相容的可呼叫物.

方法五,古典的strategy模式

將健康計算函式做成乙個分離的繼承體系中的virtual成員函式.

每個gamecharacter物件都內含乙個指標,指向乙個來自healthcalcfunc繼承體系的物件

};優點,只要為healthcalcfunc繼承體系新增乙個派生類,就可以將乙個既有的健康演算法納入使用.

啟發:針對具體的應用問題,需要認真分析其應用的特點,以及應用的後續擴充套件等問題,再從眾多的方法,選取最合適的方法.

不能先入為主的,隨便的套用乙個方法,這樣可能會導致應用的後續擴充套件問題.總之,遇到問題,先想,再比較,最後確定方案.

考慮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...

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

大多時候,我們會自然而然的想到使用virtual手法來塑模現實中的類。但是,實際上也有別的方案可以替代virtual手法的,即 考慮virtual函式以外的其他選擇。下面介紹的便是幾種可以替代virtual的方案。1 non virtual inte ce 是template method 設計模式...