java中的抽象类和接口最佳实践

时间:2009-12-19 07:25:24

标签: java oop inheritance interface abstract-class

所以你有一个接口和一个抽象类,它实现了接口中方法的一个子集。你还有一些继承抽象类的类,并给出了抽象类没有给出的方法的实现。

那么这里的最佳做法是什么?我在谈论的问题如下:

1)抽象类应该实现接口还是它的子类?应该每节课吗?在我看来,只是抽象类应该。当然,所有类都可以实现接口,但这似乎是多余的,因为抽象的子代将“继承”接口,因为它们扩展了抽象类。

2)鉴于抽象类实现了接口的一部分,它是否还应该为它没有实现的方法声明抽象方法?在我看来,这是正确的,但在某种程度上,这似乎是多余的,因为抽象的孩子需要实现这些方法才能编译。

那么您对最佳实践的理由是什么?问题归结为:我们有一个接口定义了我们想要某些类做什么,我们在接口中有一个定义常见行为的方法子集,我们有几种不同的定义方法非常见的行为。什么是最好的解决方法?

5 个答案:

答案 0 :(得分:9)

应该帮助你的原则id干:不要重复自己(http://en.wikipedia.org/wiki/Don%27t_repeat_yourself)。

在这种情况下,DRY意味着你不应该做不必要的工作。

因此,对于第一个问题,抽象类应该实现接口,因为它可以避免在每个具体类中重复“implements X”子句。

至于第二个问题,重复实现它的抽象类中的接口方法是没有意义的。这是多余的工作。此外,当接口演变/更改时,您需要更改抽象类中的对应(抽象)方法,这是一个令人头疼的问题。在某些时候,你会错过更新一些方法,具体类需要徒劳地实现这些方法。

答案 1 :(得分:2)

抽象类应该实现接口,并提供公共成员函数的具体实现。 IIRC它不应该为它没有实现的元素声明抽象方法,因为假定这些方法需要由子类实现。

答案 2 :(得分:2)

最灵活的编程方式是:

  1. 提供界面
  2. 提供实现接口的抽象类
  3. 提供从抽象类扩展或从另一个类扩展并实现接口的具体类
  4. Alway(除非你不能)将变量/参数/常量声明为接口而不是抽象类或具体类
  5. 让具体类实现接口没有意义(稍后)。 让抽象类从接口重复抽象方法没有意义。

    通过执行#4,您可以确保可以使用实现该接口的所有类 - 如果您要使用抽象类,则不能使用实现该接口但不扩展抽象类的类。

    (后半部分)

    具有抽象类和具体类实现接口的一个参数是,如果您稍后将具体类更改为不再扩展抽象类,那么您可能忘记也实现接口,在某些在没有编译器抱怨的情况下,可能会破坏代码。我不知道我对这个论点的看法。

答案 3 :(得分:1)

接口方法是隐式抽象的,因此如果抽象类实现接口,则不需要在抽象类中满足接口契约。抽象接口在技术上是合法的,但也是多余的。只要所有子类都以其他方式实现接口,抽象类就可以实现接口,但抽象类不应包含已实现的方法。

接口方法是特定于实现的(对于实现类是唯一的),而抽象状态和行为在实现中是通用的或共享的。将接口方法实现为通用功能将是一种矛盾。

关键问题是您计划如何使用接口实现?如果基本接口除了定义附加合同之外没有用于任何其他东西,我会说简单地将抽象方法添加到抽象类,否则接口是冗余开销。如果你发现一个用例,你想要访问接口方法,但不一定是通用功能,那么接口是值得的。

答案 4 :(得分:0)

您是否有比抽象类或其子类更多的接口实现?你的设计需要接口吗?否则,界面对您的设计没有任何贡献,我建议您简单地删除它。

当涉及到显式问题时,抽象类应该实现接口。扩展抽象类的类不应该。

您不应该在接口中已经存在的抽象类中冗余地声明抽象方法。