0

试图理解我在测试中出错的问题:


继承与实现接口有何不同?

  1. 通过继承,类从其超类获得行为。
  2. 使用接口,类从它实现的接口中获得行为。(这是我选的那个)
  3. 通过继承,一个类必须实现其超类定义的方法。
  4. 使用接口,一个类从它实现的接口中获得实例变量和行为。

我的想法是接口定义行为,而超类定义特征......或者它们是否相同?还是我的理解完全倒退了?


编辑:我想我应该指定我确实知道接口和继承之间的区别。我只是想知道使用术语behavior的两个选项。我不知道教授是否对术语吹毛求疵,或者他是否问得不好。

我知道当你实现一个接口时,你必须实现接口中定义的所有方法。因此,我会说接口定义了一个类必须具有的行为,但是扩展了另一个超类(尽管它确实也定义了一些行为(可以给子类更多的行为),它似乎并不像定义行为的接口。如果类实现了接口,则可以确定它具有某些行为。

也许这个问题是要问接口本身是否有行为代码,或者它是否只是定义——如果这样说的话,我会知道答案的。

4

7 回答 7

2

当你实现一个接口时,你不必太在意它的实现。还请记住,您可以实现任意数量的接口,因为它们只指定合约而不是如何实现它们。界面的创建者让您负责。

当你扩展一个对象时,通常是因为你需要一些已经存在的对象已经拥有的功能,但只需要额外的一点。或者您想重新定义已经存在的对象的一些现有行为。

给你答案:1是对的。您不必实现超类(继承)的方法。只有当它是抽象的时,这个超类的下一个子类才需要实现方法(就像在接口中一样)。

于 2012-12-08T02:05:43.197 回答
2

我认为您的一些误解可能纯粹源于语义。也许描述接口的更直接的方式是它定义了一个 API,但不提供该 API 的实现。需要注意的是,我将使用 Java 作为示例,但在像 C++ 这样的语言中,实现接口一种特殊类型的继承——即从由纯虚函数组成的类继承。

例如,在 Java 中,您可能将 EventListener 接口定义为:

public interface IEventListener {
    public void handleEvent(Event event);
}

使用问题的措辞,该接口没有说明实现 IEventListener 接口的类在接收事件时的行为,它只确保实现该接口的任何类都具有能够接收事件的特性类型事件。

另一方面,继承允许超类也继承行为(实现)。例如,考虑以下 Java 基类:

public abstract BaseClass {
    public void baseMethod(int value) {
        System.out.println(int);
}

public class SubClass extends BaseClass {
}

任何从 BaseClass 继承的类都获得 BaseClass 的 API(特性)和实现(行为)。换句话说,你不仅可以调用instanceOfSubClass.baseMethod(1),一个特性,这样做会导致BaseClass中定义的行为,即1被打印到控制台。

所以你的答案(2)是不正确的,因为接口没有指定行为(实现)只有 API(特征)。继承可以处理两者。

我认为问题的重点是解释当您想要共享行为而不仅仅是 API 时,继承特别有用。也就是说,实现(行为)也可以通过组合来共享,这样的策略通常更好 - 请参阅 Bloch 的 Effective Java 中的第 16 条以获得很好的讨论。

于 2012-12-08T02:53:00.047 回答
0

实现 x 接口的对象告诉对象它必须执行接口定义中列出的所有操作(方法)。所以在实现 x 的对象中,你需要实现所有的动作。无法实例化接口。

但是当您从对象 y 继承时,对象 y 可能已经实现了某些操作。如果不是,该方法将被标记为抽象(在 java 中),您需要在继承的对象中实现它。

于 2012-12-08T02:08:50.383 回答
0

这是 Java 中一个非常常见的 OO 设计问题。

真诚地推荐这篇关于这个主题的非常好的文章,它很好地解释了它

http://www.javaworld.com/javaqa/2001-04/03-qa-0420-abstract.html

于 2012-12-08T02:15:36.277 回答
0

正确答案是 1。您选择的答案(选项 2)是错误的,因为接口在技术上没有任何行为。它们只是抽象方法的列表。您可以将它们更多地视为您可以在其上创建类的模板。例如,假设一个项目被分成两部分,最后需要整合。每个团队都可以使用一个通用接口来建立他们的类,这样集成就会变得容易得多。

于 2012-12-08T02:16:24.993 回答
0

继承,你得到一只猫。有了一个界面,你就得到了一只猫的骨架。

于 2012-12-08T02:17:37.267 回答
0

您从继承中获得行为和实现。请记住,子类从其超类继承所有非构造函数和私有方法。这意味着您可以继承某些方法的功能(实现)。

通过实施,您可以获得公正的行为。你对实现所做的只是与编译器签订合同,说你承诺覆盖在实现的类或接口中定义的所有抽象方法。

我希望这会有所帮助。

于 2012-12-08T02:20:03.670 回答