【问题标题】:choosing interface or abstract class选择接口或抽象类
【发布时间】:2012-08-07 01:01:47
【问题描述】:

在一次采访中,有人要求我证明什么时候选择接口,什么时候选择抽象类,以及在什么情况下你会从这两个中选择一个。我已经提出了我对接口的分析,那就是...

接口是类型声明或定义合约的最佳选择 多方之间。 如果多个程序员在项目的不同模块中工作,他们仍然通过定义接口而不是等待来使用彼此的 API 为实际实施做好准备。

这为我们在编码和 发展。使用接口还可以确保最佳实践,例如 “为接口编程而不是实现”并导致更多 灵活且可维护的代码。

但我没有充分的理由证明抽象类的合理性,请指教..!

【问题讨论】:

  • 抽象类也有类似的优点。 对接口进行编程并不意味着与使用interface 相同,它也可以使用抽象类来完成。使用抽象类的主要原因是提供一些可以被所有子类共享的实现。这里的主要限制是一次只能扩展一个类。

标签: java interface abstract-class


【解决方案1】:

当您想要提供部分实现时使用抽象类。

【讨论】:

  • 为了 OP 的缘故,可能需要更多说明。
  • @Dennis 我给了他主要原因,如果他自己充实,他会受益更多。
  • 我想我无法反驳。
  • 在 Java SE 8 中,您也可以为接口提供部分实现。
  • 是的,但是作为一个抽象可以用作一个接口(所有抽象),这个答案有点没抓住重点。这个问题更多是从设计的角度来看 - 有时使用一个比另一个更有意义。
【解决方案2】:

接口声明与实现它的任何东西的合同。这是保证类将包含接口中的方法。

抽象类的相似之处在于,它的任何子类也必须实现抽象方法,但您也可以拥有包含代码的工作方法。

我在 Android 编程中经常使用接口进行回调。如果我有很多类似的数据要显示并且只想对实现进行小的更改,我会使用很多抽象类。使用抽象类来减少重复代码,同时仍然有不同的实现。

【讨论】:

  • java.sql 的接口可能包含未实现的方法。在 Java SE 8 中,您将能够在接口中拥有工作方法代码。
【解决方案3】:
  • 如果需要,抽象类可以具有默认行为(实现),而接口则不能。

  • 抽象类可以为所有方法或不提供任何方法的默认行为,而接口则不能。

  • 抽象类可以与所有子类共享状态,接口不指定状态。

  • 你可以实现多个接口,你只能扩展一个(抽象)类。

【讨论】:

  • 从 Java SE 8 开始,接口可以有默认实现。
【解决方案4】:

您对接口的定义是正确的。

抽象类应该服务于完全不同的目的。例如,假设您正在为动物模拟器实现几个类。 'Animal' 定义了几种行为,这些行为可能已经有了基本的实现,但它本身并不是实例化有意义的东西。 'Mamal' 也是如此,它是 'Animal' 的一个 bubclass。只有一个子类“老虎”不是抽象的,但老虎所做的大部分与老虎无关的事情都会在它的抽象超类中实现。

【讨论】:

    【解决方案5】:

    抽象类用于将多个具体类归为一个实体。

    以抽象类Animal为例。 动物不是具体的东西。这是一个动物家族。但它们都有某些共同点,例如,每个都有一个speak() 选项(好吧,除了 fish 和 sort)。但每个人都以不同的方式实现它。这样您就可以只覆盖不一样的方法,例如sleep() or breath() 是常见的(同样,鱼是不同的:))。

    另一方面,接口是“动作”的更直接定义。这就是为什么 Java 中的大多数(如果不是全部)接口都以“able”结尾(Comprable、Serializable...) 通过实现接口,您是在告诉其他程序员或曾经使用您的代码的人,这个类可以做到这一点。 例如,一条狗不是 Animable。

    基本上,总结一下,我认为最好的定义就是这个。 当你有一个A is kind of B 的类和A can do B 的接口时使用抽象类。

    希望对您有所帮助。

    【讨论】:

    • 你偷了我的 Animal 例子,但我真的很喜欢你的结束语。 +1 简明扼要地总结一下。
    • 我很确定 Java 库中的大多数接口都不会以 able 结尾。 “有点”与“可以做”让我印象深刻。
    • @Petrucio,对不起。没看到。这是我大学里使用最广泛的例子。汤姆霍廷,我不明白你想说什么。至于“能”,我用过的最多。可运行,可比较,可序列化。这就是我试图传达的。
    【解决方案6】:

    1.一般来说,当我们需要强制关闭Sub-Class上的某些功能时,需要Abstract class 来自 Super-Class让子类可以灵活地添加其他功能。

    例如:

    Let Car be the Abstract Super-Class, which has 4 Tyres, 1 Steering ,etc...

    Now the Sub classes like Santro i10, Maruti-800, Mahindr Bolero etc are Sub classes, but they need to have 4 Tyres, 1 Steering to be called a car, not they can have a radioor not as an additional feature.

    2. Interface 是在 java 中引入的,因为 没有多重继承。

    3.Interface更多地是关于提供一个role

    例如:

    Let Dog be the Super-Class.

    Wild Dogs and Pet Dogs are Sub-Classes.

    Wild Behavior and Pet Behavior are Interfaces

    Now as both Wild Dog and Pet Dog are dogs, but with different behavious. Then they mustimplement the Wild Behavior or Pet Behavior respectively

    【讨论】:

      【解决方案7】:

      当您希望您的类仅在情况需要时实现方法时,您会想要使用抽象类。

      举个例子,如果您有一辆超一流的车辆,并且您希望您的子车型有轮子的话,他们会为您提供数量。如果它们是船,你就不需要它们,所以合同会强制你仍然实现,而你可以直接为你的抽象类忽略它。

      【讨论】:

        猜你喜欢
        • 2011-03-28
        • 1970-01-01
        • 2012-11-06
        • 1970-01-01
        • 2011-02-27
        • 2011-01-09
        • 1970-01-01
        • 2014-08-03
        • 2011-04-13
        相关资源
        最近更新 更多