鉴于传统代码的覆盖方法,该系统具有的类层次结构如下:为家庭子类
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