【问题标题】:Design hierarchy with minimal code written用最少的代码编写设计层次结构
【发布时间】:2018-01-08 01:28:57
【问题描述】:

我曾经被要求设计类/接口层次结构以实现具有最少代码冗余的类

假设有 3 个类,其中每 2 个类为某个方法共享相同的代码(即 A 类和 B 类都有 methodAB(),B 类和 C 类都有 methodBC() 等)

在这样的背景下,有人问我创建一个抽象类是否更好,每个类(A、B、C)都扩展或实现接口,或者可能以不同的方式解决它?

假设这个问题可以扩展到 4 个类(当每个 3 个类具有相同的 equal 方法时)等等。什么是最好的解决方案?有没有办法让每个方法的代码只写一次?

【问题讨论】:

    标签: class interface abstract-class hierarchy


    【解决方案1】:

    如果您要使用抽象类,您会遇到一个问题,即(从您的示例中)B 必须与 A 类和 B 类共享方法。因此,如果您有一个 A 类和 B 类都扩展的 AB 类,则不能让 B 再次扩展一个 BC 类。正如您所说,您可以使用接口来做到这一点,但是您将只共享方法的原型,而不是实现。

    话虽如此,例如,C++ 是一种允许多重继承的语言,这带来了您需要注意的其他问题(钻石问题等)。此外,在 Java 8 中,您会在接口中获得 default methods(implementation)。

    在您的问题中,我认为我们正在查看delegation pattern。确保通过其他设计模式 - 策略也有点相似。

    【讨论】:

    • 是的,设计模式,这可能是他们对我的期望......我会从那里开始。谢谢!
    【解决方案2】:

    在这种情况下,需要回答两个问题 -

    1. A、B、C 是否可以相互替换?如果是,则表示一种方法可以 在每个班级都没有意义。这种情况很少出现,当我们有 强制少数类(彼此不相似)继承自 公共基类(例如,当我们强制使用叶子和 复合具有相同的基类)。如果这种人为的“IsA” 出于某种原因需要关系,我们需要有共同的 A、B、C 的基类,并为其中一个提供空实现 每个类中不可用的方法(妥协)。但我觉得我们需要 有理由建立这种人为的关系。
    2. AB、BC 和 CA 对是否可以相互重复(例如 A 和 B 是 可更换一种功能,其中 B 和 C 是可更换的 其他功能)?如果答案是肯定的,那么我们需要 在一个接口中捕获每个方法并将接口实现为 必需的。一个虚构的例子可以是 A 和 B 是 Runnable,B 和 C 是 Comparable 并且 C 和 A 是 ActionListener。

    但一般来说,这种症状需要在对象模型级别重新检查。可能我们会发现我们违反了单一责任原则或“IsA”关系。此类补丁将来可能会出现问题。

    【讨论】:

    • 我不是很具体地问这个问题。问题是这些常用方法在名称方面是相同的。所以每个类都有 methodAB() 但 A 和 B 有相同的实现,当 C 类有不同的(但仍然命名为 methodAB() )等等。所有这些类都应该彼此“平行”,这意味着在最简单的情况下,它们都应该是基类的扩展——但问题是我们真的需要基类还是只需要一个或......?
    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多