扩展类层次结构

时间:2013-05-30 19:52:49

标签: oop theory

最近,我发现了一个令人费解的(对我而言)问题:假设我有一个C 1 ... C_ n 类的层次结构。假设至少一些类具有多个(直接)子类,但没有一个具有多个父类(即没有多重继承)。我想改变层次结构的行为。我的第一个冲动是创建子类D 1 ... D n 并根据需要覆盖方法,但是有一个问题:当调用新重写的方法时,实际的D i 可能需要作为正式的D 1 (或其间的某个级别)传递;这可以通过继承C1 -> D1 -> D2 ...来解决。但是当调用一个未改变的方法时,任何实际的D i 都需要作为一个正式的C i 传递,所以我们必须得到每个D i 直接来自Ci。是否有任何优雅或普遍接受的方式来解决这个谜语?如果是这样,有没有办法不诉诸多重继承?

如果没有通用的方法来实现这一点,原始C层次结构的作者是否可以遵循某些规则来提供这种可能性?

对于那些喜欢更实用的方法的人来说,原始层次结构在Ada中实现了SOAP。我正在研究XML-RPC。从抽象的角度来看,SOAP是XML-RPC的超集,但实际的XML“在线”是完全不同的。原则上,可以通过丢弃一些数据类型来执行大部分工作(例如,XML-RPC有一个整数和一个浮点类型,而SOAP有几个),并替换将剩余类型转换为和来自XML。 但是,由于上述继承问题,我最终复制了几乎整个SOAP层次结构。我能够正确重用的唯一代码原来是HTTP部分(因为它不仅仅涉及文本有效负载,而不涉及SOAP对象)。

[编辑:删除了一个简化的假设,允许一个不适用于更普遍问题的简单解决方案]

1 个答案:

答案 0 :(得分:2)

解决方案,因为你假设单继承和直接子类关系,只是创建D(1)作为C(n)的子类,在这种情况下,所有Ds也将在每个C类中。

实际上,解决方案不是无缘无故地创建深层次的层次结构。如果你真的进入小班,那么使用一种能够以某种形式容纳多重继承的系统。