【问题标题】:abstract class and interface what will be change抽象类和接口会发生什么变化
【发布时间】:2014-04-24 16:10:04
【问题描述】:

我们有一个抽象类Parent,还有另外两个类:class ChildOneChildtwo,它们都继承自Parent

问题:如果我们将Parent声明为一个接口,当ChildOneChildTwo都实现这个接口时会发生什么或改变?

【问题讨论】:

  • 你说的拒绝Parent作为接口是什么意思?另外,Parent 只能是抽象类或接口,不能两者兼有。
  • 拒绝 Parent 作为接口。我猜你的意思是定义。这取决于你想如何设计。使用接口获得的一个简单优势是可以选择从多个层次结构树实现。
  • 如果您将Parent 从抽象类更改为接口,可能多态调用方法需要稍长的时间,因为一个类可以实现多个接口,这意味着数据它们背后的结构必须稍微复杂一些。但是,这只是猜测,我没有尝试过。

标签: java interface abstract-class


【解决方案1】:
  1. 语法,这些类需要implements Parent 而不是extends Parent

  2. 在 Java 7 或更早版本中,接口不能包含方法实现,因此您需要在 ChildOneChildTwo 中重写它们。 (从 Java8 开始,您可以在接口中编写默认方法实现)。

  3. 由于接口不能保存属性,您还需要在ChildOneChildTwo 中复制它们。

【讨论】:

  • Java 8 现在也支持接口中的静态方法。
  • @PeterLawrey 我不明白我写的内容有什么不同。
  • @ArnaudDenoyelle default 方法和 static 方法之间有很大的不同。 Default 方法是实例方法,但它们不必在实现类中实现,因为提供了默认值。
【解决方案2】:

如果你把一个抽象类变成一个接口,你需要

  • 实现接口而不是扩展类
  • 不调用 super() 构造函数。
  • 不调用任何超级方法。
  • 将接口中的任何方法覆盖/实现方法公开。抽象类中的方法不必是公共的。

【讨论】:

  • 还要确保将抽象父类中的所有实现方法重构为子类。
  • @Qix 我假设接口编译但子类需要更改。
【解决方案3】:

假设您的意思是定义,当您说“如果我们拒绝将 Parent 作为接口”中的拒绝时,更改应如下所示。 1. 你应该失去写在父类中的功能。 2.无论你要在接口中定义什么抽象函数(替换Parent),你都必须为Child编写不同的独立实现。

【讨论】:

    【解决方案4】:

    当您将Parent 作为抽象类时,ChildOneChildTwo 将继承Parent 中定义的非抽象方法。这意味着ChildOneChildTwo 默认会从Parent 获得一些功能。这特别有用,当ChildOneChildTwo有一些共同的功能,可以放在Parent中。

    当您将Parent 设为接口时,ChildOneChildTwo 将需要实现Parent 中的所有方法。

    【讨论】:

      【解决方案5】:

      ChildOneChildTwo 当两者都发生时会发生什么或改变 实现这个接口

      这些不会发生任何事情——它们只能扩展一些不同的类(因为在 Java 中一个类只能扩展一个类,但可以实现许多接口)。因此,如果可能,最好将 Parent 声明为接口而不是抽象类。

      如果在 Parent 中定义了一些字段、构造函数或非抽象方法,当然不可能将 Parent 从抽象类更改为接口。请记住,接口只能包含抽象方法声明 - 没有字段、方法实现或构造函数声明(除非我们说的是静态字段/方法,但是当我们讨论继承时这些是不可能的)。

      【讨论】:

        猜你喜欢
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 2011-01-23
        • 2017-02-19
        • 2014-04-12
        • 1970-01-01
        相关资源
        最近更新 更多