这可能是一个通用的OOP问题。我想在接口和抽象类的使用基础上做一个通用的比较。

什么时候需要使用接口,什么时候需要使用抽象类?


当前回答

如果你认为java是面向对象语言,

“接口不提供方法实现”在Java 8启动后不再有效。现在java为默认方法提供了接口实现。

简单来说,我想用

接口:通过多个不相关的对象实现一个契约。它提供了“HAS A”功能。

抽象类:在多个相关对象之间实现相同或不同的行为。它建立了“IS A”关系。

Oracle网站提供了接口和抽象类之间的关键区别。

考虑使用抽象类,如果:

您希望在几个密切相关的类之间共享代码。 您希望扩展抽象类的类具有许多公共方法或字段,或者需要除public以外的访问修饰符(例如protected和private)。 您希望声明非静态或非final字段。

考虑使用接口,如果:

您希望不相关的类实现您的接口。例如,许多不相关的对象都可以实现Serializable接口。 您希望指定特定数据类型的行为,但不关心由谁实现其行为。 您希望利用类型的多重继承。

例子:

抽象类(IS一个关系)

Reader是一个抽象类。

BufferedReader是一个Reader

FileReader是一个阅读器

FileReader和BufferedReader用于一个共同的目的:读取数据,它们通过Reader类相互关联。

接口(具有功能)

Serializable是一个接口。

假设您的应用程序中有两个实现Serializable接口的类

Employee实现Serializable

游戏实现Serializable

在这里,你不能通过Serializable接口在员工和游戏之间建立任何关系,这是为了不同的目的。两者都能够序列化状态,比较到此结束。

看看这些帖子:

我应该如何解释接口和抽象类之间的区别?

其他回答

这是一个很难打的电话。

我可以给出一个提示:一个对象可以实现许多接口,而一个对象只能继承一个基类(在像c#这样的现代OO语言中,我知道c++有多个继承-但这不是不受欢迎吗?)

抽象类可以具有共享的状态或功能。接口只是提供状态或功能的承诺。一个好的抽象类可以减少必须重写的代码量,因为它的功能或状态可以共享。接口没有可共享的已定义信息

对我来说,在很多情况下我会选择接口。但在某些情况下,我更喜欢抽象类。

OO中的类通常指的是实现。当我想强制一些实现细节到子程序时,我使用抽象类,否则我就使用接口。

当然,抽象类不仅在强制实现方面有用,而且在许多相关类之间共享一些特定的细节方面也有用。

如果我们有一个对所有派生类都相同的实现,那么此时最好使用抽象类而不是接口。当我们有一个接口时,我们可以将我们的实现移动到任何实现接口的类。在抽象类中,它避免了代码重复,并共享所有派生类的实现。接口允许开发松散耦合的系统,这有助于更好的测试。

什么时候做什么是一件非常简单的事情,如果你有清晰的概念在你的脑海里。

抽象类可以是派生类,而接口可以是实现类。这两者之间有一些区别。当派生抽象类时,派生类和基类之间的关系是“is a”关系。例如,狗是动物,羊是动物,这意味着派生类从基类继承了一些属性。

而对于接口的实现,关系是“可以是”。例:狗可以是间谍犬。狗可以是马戏团的狗。狗可以是比赛犬。这意味着你要实现特定的方法来获取某些东西。

我希望我讲清楚了。