繁体   English   中英

扩展对象与实现接口

[英]Extending an object vs Implementing an interface

试图理解一个问题,我在考试中错了:


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

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

我的想法是接口定义行为,而超类定义特征……还是它们相同? 还是我的理解力完全落后了?


编辑:我想我应该指定我确实知道接口和继承之间的区别。 我只是想知道使用术语行为的两个选项。 我不知道教授是否对术语about之以鼻,还是他问的问题很不好。

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

也许这个问题是要问接口本身是否具有该行为的代码,或者仅是定义-如果以这种方式措辞,我会知道答案的。

在实现接口时,您不必太在意实现。 还要记住,您可以实现所需的任意数量的接口,因为它们仅指定合同,而不指定如何履行合同。 界面的创建者可让您解决这一问题。

扩展对象时,通常是因为您需要某些功能,而现有对象已经拥有了大部分功能,而只需要一点额外的功能。 或者,您想重新定义现有对象的某些现有行为。

给您答案:1是正确的。 您不必实现超类(继承)的方法。 仅当抽象时,此超类的下一个子类才需要实现方法(例如在接口中)。

我认为您的某些误解可能完全源于语义。 也许描述接口的更直接的方法是它定义了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项。

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

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

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

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

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

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

通过继承,您会养猫。 通过界面,您会得到猫的骨骼。

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

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

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM