【问题标题】:Is there a scenario where an Abstract class is preferred over Interface是否存在抽象类优于接口的场景
【发布时间】:2011-09-21 05:20:34
【问题描述】:

我有一个场景,其中有几个子类具有相似的实现以及一些额外的方法,每个子类的实现不同。我认为抽象类对于这种情况是一个不错的选择。但是,如果该抽象类实现一个包含所有方法声明的接口会更好吗?或者我应该坚持使用抽象类。

简而言之,我想知道在哪些情况下我应该更喜欢层次结构顶部的抽象类而不是接口。

【问题讨论】:

标签: java interface abstract-class


【解决方案1】:

总是喜欢界面。您应该非常努力地避免使用抽象类。话虽如此,抽象类尤其在类似于 java 集合的库代码中占有一席之地。在这些地方,您正在构建专门为扩展而设计的类,并且在整合行为方面有很多价值,尤其是从质量的角度来看。

【讨论】:

    【解决方案2】:

    如果您的子类与抽象类有 is-a 关系,请使用抽象类。

    您可以同时拥有一个抽象类和一个接口——抽象类指定实现,接口指定 API。

    集合框架就是一个例子——它有ArrayList extends AbstractList implements List

    【讨论】:

    • 是的,我知道我可以同时拥有抽象类和接口,但这是最好的方式吗??
    • en.wikipedia.org/wiki/Template_method_pattern 这里他们只使用了抽象类Game,而不是使用抽象类和接口。知道为什么会这样。有什么优势吗??
    【解决方案3】:

    抽象类让您可以携带一些代码/数据,然后您可以在继承的类中使用这些代码/数据。它们对此非常有用,但非常谨慎地使用继承。仅当新类与抽象类完全可互换时,才从类继承。

    接口不包含代码。

    我更喜欢尽可能为接口编写代码。我也喜欢让这些接口尽可能小。这让我可以灵活地在以后更换底层实施。

    如果您对抽象类进行编码,则以后更难换出实现。

    您可以将一个接口(或几个小接口)应用于抽象类。听起来这可能是您最好的方法。

    【讨论】:

      【解决方案4】:

      抽象类可以提供接口不能提供的默认行为。当行为的一部分在多个子类中是通用的时,这是有意义的。

      一个很好的用法是模板方法模式:http://en.wikipedia.org/wiki/Template_method_pattern,它减少了顺序耦合。

      【讨论】:

      • 是的,这是有道理的。但是如果我添加一个接口说GameInterface并在那里做所有的方法声明并让抽象类Game实现GameInterface,那么设计中是否有任何缺点。这个问题只是出于好奇。谢谢
      • 这实际上是一种常见的做法。例如,你会在 java 的 API 中看到很多这样的东西。但在这种情况下,基于组合的模式(例如装饰器)通常是更好的解决方案。
      【解决方案5】:

      抽象类不必是完全抽象的。您可以定义所有子类将按原样使用的某些函数(和变量),并仅保留某些方法由子类实现。接口有不能定义函数的限制。

      另一方面,接口允许一个类灵活地实现多个接口,而一个类只能扩展另一个类。从这个意义上说,接口可能总是比抽象类更可取。但是包含一些重用功能的抽象类仍然有很多用途。

      【讨论】:

        【解决方案6】:

        请记住,使用抽象类,您可以定义子类拥有的数据。使用接口,您只能定义实现者必须实现的方法。那么在您的情况下,您需要通用数据和通用方法还是只需要通用方法?

        【讨论】:

        • 实现相同的常用方法
        • 甚至不一定是相同的实现。例如,子类可能会覆盖基类中函数的实现。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 2011-02-27
        • 2015-03-13
        • 1970-01-01
        • 2011-05-22
        • 2017-09-12
        • 1970-01-01
        相关资源
        最近更新 更多