142

在 C# 中,什么时候应该使用接口,什么时候应该使用抽象类?什么可能是决定因素?

4

4 回答 4

153

更新:C# 8.0 新特性: 从 C# 8.0 开始,接口可以为成员定义默认实现,包括属性。为接口中的属性定义默认实现很少见,因为接口可能不定义实例数据字段。

抽象类的优点是:

  • 能够指定方法的默认实现
  • 向函数添加了不变检查
  • 对如何调用“接口”方法有更多的控制
  • 能够“免费”提供与界面相关或无关的行为

接口只是数据传递合约,没有这些功能。但是,它们通常更灵活,因为类型只能从一个类派生,但可以实现任意数量的接口。

于 2009-04-14T13:21:52.433 回答
111

抽象类和接口在语义上是不同的,尽管它们的用法可以重叠。

抽象类通常用作类似类的构建基础。类的通用实现可以在抽象类中。

接口通常用于指定类的能力,其中类不必非常相似。

于 2009-04-14T13:26:28.567 回答
12

要考虑的另一件事是,由于没有多重继承,如果您希望一个类能够从您的接口/抽象类实现/继承,但从另一个基类继承,请使用接口。

于 2009-04-14T13:29:37.860 回答
9

真正的问题是:是使用接口还是基类。这在之前已经介绍过了。

在 C# 中,抽象类(用关键字“abstract”标记的)只是一个无法实例化对象的类。这与简单区分基类和接口的目的不同。

于 2009-04-14T13:24:04.720 回答