0

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

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

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

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

4

1 回答 1

2

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

在实践中,解决方案不是无缘无故地创建深层类层次结构。如果您真的很喜欢小类,那么请使用以某种形式容纳多重继承的系统。

于 2013-05-30T19:59:00.083 回答