实施还是扩展?

时间:2013-06-19 14:42:50

标签: java object-oriented-analysis

假设我有一个接口C和一个实现它的A类。

现在假设我想将A的实现更改为C中的所有函数,除了一个,使用类B.我应该扩展A并覆盖C还是应该将C实现为一个新的独立类?

让我们说一些手机公司想要实现他们的基本接口手机,他们已经有一些旧的OldPhone实现,他们希望保留所有功能:拨打电话,挂断电话,发送短信 - 他们不要我们想要改变所有这些但他们确实需要其他新功能来制作他们的新智能手机 - 他们是应该扩展OldPhone还是制作一个新的类?

我想知道何时应该扩展类,何时应该从头开始实现接口 - 一方面我不想复制代码,而另一方面有时候是类型,即使它们都是A,在概念上是不同的。

5 个答案:

答案 0 :(得分:2)

如果OldPhoneSmartPhone中有共享功能,您可以将其提取到(抽象)类中,让两者都扩展它,让它们将另一个作为差异。

否则转到界面

答案 1 :(得分:2)

如果您有要重用的代码,那么扩展是更好的选择。

但问问自己:新款手机是旧手机的一个更好的版本,还是一个只有类似功能的全新手机?

  • 在第一种情况下:延长。
  • 在第二个抽象中,你要搜索的是:提取共同的函数并将它们放在一个抽象类中,这两个类都将扩展。

答案 2 :(得分:2)

这取决于从C(旧手机)到B(新手机)的变化。以手机为例非常好,因为旧手机在概念上与新手机相同 - 它可以拨打电话。

当C的实施与手机的工作方式紧密相关时,很难实现。让我们举例说,旧手机坚持使用圆形戒指,你转而选择要拨打的号码而不是键盘。在这种情况下,如果您完全控制代码,那么您可能想尝试在接口和旧手机之间放置一层抽象。抽象层将捕捉到手机的含义,仅此而已。

获得抽象层后,您可以选择是否扩展旧手机以创建新手机或创建新手机。无论哪种方式,它都应该比现在更容易,因为旧手机将包含更少的代码,只有那些特定于它的位。

答案 3 :(得分:2)

现在请参阅您的要求说B对于大多数功能而言应该与A完全相同。 现在假设你选择实现即B的implments C.那么如果将来A类逻辑发生变化,那么你也必须改变B类。所以它不符合你的要求。

现在假设你扩展了A.然后你与A紧密耦合,好像A改变了你的大意志也会以同样的方式行事。

因此,尝试使用组合来充分利用两个单词。 B实现C并使用 A作为委托来实现这些方法。我的答案是针对你的情况,它不一定是每种情况下的最佳选择。

答案 4 :(得分:1)

经验法则,只有在存在父子关系时才应扩展课程。否则请去接口实现。