关于OOP:接口和抽象类有什么区别?

What's the difference between an interface and an abstract class?

本问题已经有最佳答案,请猛点这里访问。

复制品:

When to use an interface instead of an abstract class and vice versa?

可能是最著名的软件开发人员工作面试问题之一。

你的答案是什么?

编辑:我想知道在现实生活中你会如何回答这个问题。请试着像在真实的工作面试中那样制定你的答案(要完整,但不要太长,当然不要发布任何链接)。


接口只描述其方法等的实际签名。任何实现该接口的类都必须提供显式实现。

抽象类可以包含其方法等的部分实现。


接口提供必须由类实现的方法的定义。接口的目的是允许您概括特定的功能,而不考虑实现。您可能有一个IDatabase接口,它有一个Open/Close方法。实现该接口的类可能正在连接到MySQL数据库或MS Access数据库。不管它是如何完成这项任务的,目标仍然是一样的……打开数据库,关闭数据库。

抽象类是包含一些抽象方法的基类。它们不能被实例化,它们将从中派生。抽象类的目的是允许您定义一些通用功能和子类,以便在适当的情况下实现更具体的功能。

因此,总而言之,当每个类的实现完全不同时,应该使用接口。当您有一些类似的行为,但需要以不同的方式实现部分时,请使用抽象类。

希望有帮助。


抽象类可以有成员变量,接口不能(或者,在C++中不应该)。

在Java中,"接口"是一个定义良好的语法元素,而在C++中,它仅仅是一种设计模式。


就工作面试而言,我一直听说关键点是一个接口是一个合同;一个接口虽然不实现它本身,但它保证了功能性。


我认为差异是语言依赖的,但是在C++中至少抽象类是实现接口的手段。