为什么我们使用 abstract class 和 interface ? Class、Abstarct Class 和界面之间的区别

Why we use abstract class and interface ? Difference between Class, Abstarct Class and Interface

我知道这是一个非常重复的问题我也阅读了大部分 post 但没有找到满意的答案。我知道我从大多数 post 中读到的书本差异。

谁能告诉我

为什么要使用抽象class和接口?

我们什么时候用这个?

我知道当我们有一些重复的任务但每次都以不同的方式实现时,我们会使用抽象 class。

我认为我们可以通过使用 覆盖 的普通 class 和 subclass 来实现,那么 为什么我们使用抽象? 也是抽象 class 和接口之间访问说明符的差异,以及接口 中实现的 强制性。

接口是完全可以接受的,当我们想在那种情况下强制实现所有方法时我们使用接口但是为什么要抽象class? 强制执行只是区别吗?

提前致谢。

考虑一下。

接口没有实现。它强制原型到 class 但无助于实现它们。

接口不依赖于 class 层次结构。您可以将相同的界面应用于多个完全不同的 class 树。这很重要,也是接口通过抽象 class 提供的功能之一。接口是独立于实现的,你可以 "slap it onto" 任何 class。这是界面最强大的方面。

这里解释得很漂亮 - https://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

简而言之,

接口用于定义class的外围功能。换句话说,Human 和 Vehicle 都可以继承自 IMovable 接口。

一个抽象 class 定义了一个 class 的核心身份,并在那里用于相同类型的对象。

也看看https://msdn.microsoft.com/en-us/library/scsyfw1d(v=vs.71).aspx

这里有一些建议可以帮助您决定是使用接口还是抽象 class 来为您的组件提供多态性。

  1. 如果您希望创建组件的多个版本,请创建一个摘要 class。 Abstract classes 提供了一种对组件进行版本控制的简单易行的方法。通过更新基础 class,所有继承的 classes 都会随着更改自动更新。另一方面,接口一旦创建就不能更改。如果需要新版本的界面,您必须创建一个全新的界面。

  2. 如果您创建的功能将对广泛的不同对象有用,请使用接口。抽象 classes 应该主要用于密切相关的对象,而接口最适合为不相关的 classes 提供通用功能。

  3. 如果您正在设计小而简洁的功能,请使用接口。如果要设计大型功能单元,请使用抽象 class.

  4. 如果您想在组件的所有实现中提供通用的、已实现的功能,请使用抽象 class。抽象 classes 允许您部分实现 class,而接口不包含任何成员的实现。