Class 编写代码最少的设计层次结构

Class 编写代码最少的设计层次结构,class,interface,abstract-class,hierarchy,Class,Interface,Abstract Class,Hierarchy,我曾经被要求设计类/接口层次结构,以实现代码冗余最少的类 假设有3个类,其中每2个都为某个方法共享相同的代码(即类A和B都有methodAB(),类B和C都有methodBC()等等) 有人问我,在这样的上下文中,创建一个抽象类,每个类(A、B、C)都扩展或实现接口,或者以不同的方式解决它,这样做更好吗 假设这个问题可以扩展到4个类(当每3个类都有相同的equal方法时),以此类推。解决这个问题的最佳方案是什么?是否有一种方法可以使每个方法的代码只编写一次 如果要使用抽象类,那么(从您的示例中)

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

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

有人问我,在这样的上下文中,创建一个抽象类,每个类(A、B、C)都扩展或实现接口,或者以不同的方式解决它,这样做更好吗


假设这个问题可以扩展到4个类(当每3个类都有相同的equal方法时),以此类推。解决这个问题的最佳方案是什么?是否有一种方法可以使每个方法的代码只编写一次

如果要使用抽象类,那么(从您的示例中)B将不得不与类A和类B共享方法。因此,如果A和B都扩展了类AB,则B不能再次扩展类BC。正如您所说的,您可以使用接口来实现这一点,但是您将只共享方法的原型,而不共享实现

已经说过,C++是一种允许多重继承的语言,它带来了需要小心的其他问题(菱形问题等)。此外,在Java8中,您可以在接口中获得(实现)


在你的问题中,我认为我们正在考虑。确保浏览其他设计模式-策略也有点类似。

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

  • A、B、C是否可相互替换?如果是,则表示有一种方法可以 不是每节课都有意义。这种情况很少发生在我们 强制几个类(彼此不相似)从 公共基类(例如,当我们强制使用leaf和 复合,以具有相同的基类)。如果这种人为的“IsA” 关系是出于某种原因需要的,我们需要有共同点 为A、B、C提供基类,并为其中一个提供空实现 每个类中都有不可用的方法(折衷)。但我觉得我们需要 有理由建立这种人为的关系
  • AB、BC和CA对是否可以相互复制(例如A和B是 可替换为一种功能,其中as B和C是可替换的 另一个功能)?如果答案是肯定的,那么我们需要 在一个接口中捕获每个方法,并将接口实现为 必修的。一个虚构的例子可以是A和B可运行,B和C 是可比较的,C和A是ActionListener

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

    是的,设计模式,这可能是他们对我的期望。。。那我就从那里开始。谢谢我问这个问题不是很具体。问题是这些常用方法在名称方面是相同的。所以每个类都有methodAB(),但A和B有相同的实现,而C类有不同的实现(但仍然命名为methodAB()),以此类推。所有这些类都应该彼此“并行”,这意味着在最简单的情况下,它们都应该是基类的扩展-但问题是我们真的需要基类还是只需要一个或。。。?