【问题标题】:Extending a class hierarchy扩展类层次结构
【发布时间】:2013-05-30 19:52:49
【问题描述】:

最近,我发现了一个(对我来说)令人费解的问题:假设我有一个 C1...C_n 类的层次结构。假设至少有一些类有多个(直接)子类,但没有一个有多个父类(即没有多重继承)。我想改变层次结构的行为。我的第一个冲动是创建子类 D1...Dn 并根据需要覆盖方法,但是有一个问题:在调用新覆盖的方法时,实际Di 可能需要作为正式的 D1 (或介于两者之间的某个级别)传递;这可以通过子类化C<sub>1</sub> -&gt; D<sub>1</sub> -&gt; 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 对象无关)。

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

【问题讨论】:

    标签: oop theory


    【解决方案1】:

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

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

    【讨论】:

    • +1 用于快速响应和简单的解决方案。不幸的是,这很简单,因为我过于简单化了,没想到这会引入新的解决方案。
    • @AnsgarEsztermann 不是。我认为这个问题实际上并不存在,我挑战你展示它出现的层次结构。
    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多