【发布时间】:2013-05-30 19:52:49
【问题描述】:
最近,我发现了一个(对我来说)令人费解的问题:假设我有一个 C1...C_n 类的层次结构。假设至少有一些类有多个(直接)子类,但没有一个有多个父类(即没有多重继承)。我想改变层次结构的行为。我的第一个冲动是创建子类 D1...Dn 并根据需要覆盖方法,但是有一个问题:在调用新覆盖的方法时,实际Di 可能需要作为正式的 D1 (或介于两者之间的某个级别)传递;这可以通过子类化C<sub>1</sub> -> D<sub>1</sub> -> D<sub>2 ...</sub> 来解决。但是当调用一个未改变的方法时,任何实际的 Di 都需要作为正式的 Ci 传递,因此我们必须派生每个 Di sub> 直接来自 Ci。是否有任何优雅或普遍接受的方式来解决这个谜题?如果是这样,有没有什么办法不诉诸多重继承?
如果没有通用的方法来实现这一点,那么原始C层次结构的作者是否可以遵循一定的规则来提供这种可能性?
对于那些喜欢更实用的方法的人,原始层次结构在 Ada 中实现了 SOAP。我正在研究 XML-RPC。从抽象的角度来看,SOAP 是 XML-RPC 的超集,但实际的“在线”XML 则完全不同。原则上,可以通过丢弃一些数据类型来完成大部分工作(例如,XML-RPC 有一个整数和一个浮点类型,而 SOAP 有几个),并替换将剩余类型转换为和来自 XML。 但是,由于前面提到的继承问题,我最终复制了几乎整个 SOAP 层次结构。我能够正确重用的唯一代码是 HTTP 部分(因为它不仅与文本有效负载有关,与 SOAP 对象无关)。
[编辑:删除了一个简化假设,该假设允许一个简单的解决方案不适用于更普遍的问题]
【问题讨论】: