一尘不染

接口 vs 抽象类(通用 OO)

oop

我最近接受了两次电话采访,被问及接口和抽象类之间的区别。我已经解释了我能想到的每一个方面,但似乎他们在等我提一些具体的事情,我不知道那是什么。

根据我的经验,我认为以下是正确的。如果我遗漏了一个要点,请告诉我。

界面:

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

抽象类:

只有抽象方法必须由子类实现。抽象类可以具有带有实现的普通方法。除了事件、委托、属性和方法之外,抽象类还可以具有类变量。由于 C# 中不存在多重继承,一个类只能实现一个抽象类。

  1. 毕竟,面试官提出了一个问题“如果你有一个只有抽象方法的抽象类怎么办?这与接口有什么不同?” 我不知道答案,但我认为这是上面提到的继承对吗?
  2. 另一位面试官问我,如果你在接口中有一个公共变量,那与抽象类有什么不同?我坚持你不能在接口内有一个公共变量。我不知道他想听什么,但他也不满意。

阅读 161

收藏
2022-02-23

共1个答案

一尘不染

虽然您的问题表明它是针对“一般 OO”的,但它似乎确实专注于 .NET 对这些术语的使用。

在 .NET 中(Java 类似):

  • 接口可以没有状态或实现
  • 实现接口的类必须提供该接口所有方法的实现
  • 抽象类可能包含状态(数据成员)和/或实现(方法)
  • 可以在不实现抽象方法的情况下继承抽象类(尽管这样的派生类本身就是抽象的)
  • 接口可能是多重继承的,抽象类可能不是(这可能是接口与抽象类分开存在的关键具体原因——它们允许实现多重继承,从而消除了一般 MI 的许多问题)。

作为一般的 OO 术语,这些差异不一定是明确定义的。例如,有些 C++ 程序员可能持有类似的严格定义(接口是抽象类的严格子集,不能包含实现),而有些人可能会说具有某些默认实现的抽象类仍然是接口或非抽象类仍然可以定义一个接口。

2022-02-23