界面与抽象类(通用OO)

最近有两次电话采访,我被问及界面和抽象课程之间的差异。 我已经解释了他们所能想到的每个方面,但似乎他们正在等待我提及具体的事情,而我不知道它是什么。

从我的经验来看,我认为以下是事实。 如果我错过了一个重点,请让我知道。

接口:

在接口中声明的每个方法都必须在子类中实现。 只有事件,委托,属性(C#)和方法可以存在于接口中。 一个类可以实现多个接口。

抽象类:

只有抽象方法必须由子类实现。 一个抽象类可以有实现的普通方法。 抽象类也可以在事件,委托,属性和方法旁边有类变量。 由于C#中多重继承的不存在,类只能实现一个抽象类。

  • 毕竟,面试官想出了这样一个问题:“如果你的抽象类只有抽象方法会怎么样呢?这与接口有什么不同?” 我不知道答案,但我认为这是上面提到的继承权吗?

  • 另一位面试官问我,如果你在界面中有一个公共变量,那么这与抽象类有什么不同呢? 我坚持说你不能在接口中使用公共变量。 我不知道他想听什么,但他也不满意。

  • 另见

  • 何时使用接口而不是抽象类,反之亦然

  • 接口与抽象类

  • 你如何决定使用抽象类和接口?

  • 界面和抽象类有什么区别?


  • 虽然你的问题表明它是针对“通用面向对象”的,但它似乎着重于.NET对这些术语的使用。

    在.NET中(类似于Java):

  • 接口可以没有状态或实现
  • 实现接口的类必须提供该接口的所有方法的实现
  • 抽象类可能包含状态(数据成员)和/或实现(方法)
  • 抽象类可以在不实现抽象方法的情况下继承(尽管这样的派生类本身是抽象的)
  • 接口可能是多重继承的,抽象类可能不会(这可能是接口与abtract类分开存在的关键具体原因 - 它们允许实现多重继承,从而消除了一般MI的许多问题)。
  • 作为一般的OO术语,差异不一定是明确的。 例如,有些C ++程序员可能持有类似的严格定义(接口是抽象类的严格子集,不能包含实现),而有些人可能会说,具有某些默认实现的抽象类仍然是一个接口或非抽象类仍然可以定义一个接口。

    事实上,有一种称为非虚拟接口(NVI)的C ++习惯用法,其中公共方法是非虚拟方法,可以“虚拟”到私有虚拟方法:

  • http://www.gotw.ca/publications/mill18.htm
  • http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface

  • 怎么样呢?当我在空军的时候,我参加了飞行员培训,并成为了美国空军(USF)的飞行员。 那时我没有资格飞行任何东西,并且不得不参加飞机型训练。 一旦我有资格,我是一名飞行员(抽象班)和一名C-141飞行员(具体班级)。 在我的一项任务中,我被赋予了额外的职责:安全官员。 现在我还是一名飞行员和一名C-141飞行员,但我还执行了安全官员的职责(可以这么说我实施了ISafetyOfficer)。 飞行员不需要担任安全官员,其他人也可以这样做。

    美国空军的所有飞行员都必须遵守空军的一些规定,所有C-141(或F-16或T-38)飞行员都是'美国空军飞行员。 任何人都可以成为安全主任。 所以,总结一下:

  • 试点:抽象类
  • C-141飞行员:具体班级
  • ISafety Officer:接口
  • 补充说明:这是为了帮助解释这个概念,而不是编码建议。 看到下面的各种评论,讨论很有趣。


    我认为他们正在寻找的答案是OPPS的哲学差异。

    当派生类共享抽象类的核心属性和行为时,将使用抽象类继承。 实际定义类的行为类型。

    另一方面,当类共享外围设备行为时使用接口继承,而不一定定义派生类。

    例如。 汽车和卡车共享汽车抽象类的许多核心属性和行为,但它们也共享一些外围行为,例如生成排气,即使像Drillers或PowerGenerators这样的非汽车类也共享并且不一定定义汽车或卡车,所以汽车,卡车,钻机和PowerGenerator都可以共享IExhaust相同的界面。

    链接地址: http://www.djcxy.com/p/6497.html

    上一篇: Interface vs Abstract Class (general OO)

    下一篇: String representation of an Enum