鑑於傳統代碼的覆蓋方法,該系統具有的類層次結構如下:爲家庭子類
Base
^
|
----------+---------------
^ ^ ^ ^ ^
| | | | |
A1 B1 C1 D1 E1
^ ^ ^ ^ ^
| | | | |
A2 B2 C2 D2 E2
.......
^ ^ ^ ^ ^
| | | | |
An Bn Cn Dn En
層次結構表示在某些特定域的消息。
基地類當然是所有消息的基類。 A1..E1是屬於版本1的域的消息,A2..E2到版本2等等。請注意,An必須直接從An-1繼承,因爲An覆蓋了An-1的特定方法。
所有消息都有一些共同的功能,所以它被定義爲Base :: PerformFunctionality。功能的某些部分僅限於版本n,所以存在虛擬功能Base :: SpecificPartOfFunctionality,其被Base :: PerformFunctionality調用。
所以我的問題是如何覆蓋所有An..En的Base :: SpecificPartOfFunctionality。
我看到2個可能的解決方案,我不喜歡太:
實施基地::每個SpecificPartOfFunctionality和每個An..En。
該解決方案的問題是,對於每個類的實現應該是完全相同,所以我只是重複該代碼。
其他問題是,如果引入了新類Fn,開發人員可能會忘記執行SpecificPartOfFunctionality。
從基地介紹BASEN類導出,而每個從An..En BASEN太導出:
class BaseN : public Base { //... SpecificPartOfFunctionality() { ...} }; class An: public An-1, public BaseN { .. }
這種解決方案的問題是,它引入了金剛石問題。
另外一個問題是會發生什麼,如果其他一些版本米需要重寫基地:: SpecificPartOfFunctionality了。繼解決方案後,我們將介紹BaseM,這將覆蓋Base :: SpecificPartOfFunctionality。所以哪個SpecificPartOfFunctionality將要求 - 的基本N或基本N。這是完全混亂。
有什麼建議嗎?
您可以更改A1..E1類嗎?如果是這樣的話,爲什麼不實施'SpecificBase'來實現A1..E1派生的'SpecificPartsOfFunctionality',在一個單一的繼承方案中。 'SpecificBase'當然是從'Base'派生的。 – Constantinius 2011-05-14 21:02:31
我可以改變A1 ... E1。我想你正在描述我提出的解決方案2。 – dimba 2011-05-14 21:07:20
不完全,因爲你使用多重繼承(嗯......你的語法看起來不正確。) – Constantinius 2011-05-14 21:10:47