我最近接受了两次电话采访,被问及接口类和抽象类之间的区别。我已经解释了我能想到的每一个方面,但似乎他们在等我提一些具体的事情,我不知道是什么。
根据我的经验,我认为以下是正确的。如果我遗漏了一个要点,请告诉我。
接口:
接口中声明的每个方法都必须在子类中实现。接口中只能存在事件、委托、财产(C#)和方法。一个类可以实现多个接口。
抽象类:
子类只能实现抽象方法。抽象类可以具有具有实现的普通方法。除了事件、委托、财产和方法之外,抽象类还可以有类变量。由于C#中不存在多重继承,一个类只能实现一个抽象类。
在这之后,面试官提出了一个问题:“如果你有一个只有抽象方法的抽象类呢?这和接口有什么不同?”我不知道答案,但我认为这是上面提到的继承,对吧?另一位面试官问我,“如果你在接口中有一个公共变量,那会和抽象类中有什么不同?”我坚持认为你不能在接口中使用公共变量。我不知道他想听什么,但他也不满意。
另请参阅:
何时使用接口而不是抽象类,反之亦然接口与抽象类如何决定使用抽象类和接口?接口和抽象类之间的区别是什么?
接口:如果您希望在组件上暗示规则,则应使用该接口彼此相关的
赞成的意见:
允许多重继承通过不公开上下文中使用的确切类型的对象来提供抽象通过合同的特定签名提供一致性
欺骗:
必须执行所有定义的合同不能有变量或委托一旦定义,就不能在不破坏所有类的情况下进行更改
抽象类:应用于希望对彼此相关的组件具有一些基本或默认行为或实现的情况
赞成的意见:
比接口更快在实施中具有灵活性(您可以完全或部分实施)可以在不破坏派生类的情况下轻松更改
欺骗:
无法实例化不支持多重继承
如果您认为java是OOP语言来回答这个问题,那么Java8的发布会导致上述答案中的一些内容过时。现在,java接口可以具有具有具体实现的默认方法。
Oracle网站提供了接口和抽象类之间的关键区别。
如果出现以下情况,请考虑使用抽象类:
您希望在几个密切相关的类之间共享代码。您希望扩展抽象类的类具有许多公共方法或字段,或者需要公共以外的访问修饰符(如protected和private)。您要声明非静态或非final字段。
如果出现以下情况,请考虑使用接口:
您希望不相关的类实现您的接口。例如,许多不相关的对象可以实现Serializable接口。您希望指定特定数据类型的行为,但不关心谁实现了它的行为。您希望利用类型的多重继承。
简单来说,我想使用
接口:通过多个不相关的对象实现合同
抽象类:在多个相关对象之间实现相同或不同的行为
看看代码示例,以清楚的方式理解事情:我应该如何解释接口和抽象类之间的区别?