使用最少代码编写设计层次结构

时间:2017-08-01 09:02:32

标签: class interface abstract-class hierarchy

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

让我们说有3个类,每个类共享一些方法的相同代码(即A类和B类都有methodAB(),B类和C类都有方法BC()等)

有了这样的上下文,我被问到最好是创建一个抽象类,每个类(A,B,C)扩展或实现接口,或者可能以不同的方式解决它?

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

  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。
  3. 但总的来说,这种症状需要在对象模型级别进行重新检查。可能我们可能会发现我们违反了单一责任原则或“IsA”关系。这些补丁可能会在将来陷入混乱。