2017-08-01 44 views
0

我曾经要求设计类/接口层次结构来实现用最少的代码冗余等级设计层次用最少的代码编写

比方说,与有3类,其中每个2共享相同的代码对于一些方法(即是A类和B类都有方法AB(),B类和C类都有methodBC()等)

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

假设这个问题可以扩展到4个类别(每个类别中有3个具有相同的方法)等等。什么是最好的解决方案?有没有一种方法每个方法的代码只会被写入一次?

回答

1

如果您要使用抽象类,您有问题(从您的示例中)B必须与A类和B类共享方法。因此,如果您有A类和B类扩展的AB类,那么您不能让B再次延长BC级。正如你所说,你可以使用Interfaces来实现,但是你只会共享方法原型而不是实现。例如,C++就是一种允许多重继承的语言,它引发了其他需要注意的问题(钻石问题等)。此外,在Java 8中,您将在接口中获得default methods(实现)。

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

+0

是的,设计模式,这可能是他们对我的期望...我会在那里开始。谢谢! –

0

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

  1. 是A,B,C互相替换?如果是的话,这意味着在每个班级中,有一种方法对于 没有意义。这种情况很少发生,当我们有 强制几个类(彼此不相似)从 公共基类继承(例如,当我们强制leaf和 组合具有相同的基类时的复合模式)。如果由于某种原因需要这种人造“IsA”关系,则我们需要针对A,B,C具有共同的基类,并为每个类中的一个不可用方法提供空实施(折中)。但我觉得我们需要 有这种人为关系的理由。
  2. AB,BC和CA对可以互相补充(例如A和B是 可替代一个功能,其中B和C可替换 的另一功能)?如果答案为是,那么我们需要 在一个接口中捕获每种方法,并实现需要的接口为 。一个虚构的例子可以是A和B是Runnable,B和C是可比较的,C和A是ActionListener。

但是一般来说这样的症状需要在对象模型级重新检查。大概我们可能会发现我们违反单一责任原则或'IsA'关系。将来这些补丁可能会陷入困境。

+0

我没有特别提出这个问题。问题是这些常用方法在名称方面是相同的。所以每个类都有methodAB(),但是A和B有相同的实现,当C类有不同的(但仍然命名为methodAB())等等。所有这些类都应该相互“平行”,这意味着在最简单的情况下,它们都应该是基类的扩展 - 但问题是我们是否真的需要基类或者我们只需要一个还是......? –