接口与抽象类

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

177304 次浏览

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

抽象类的优点是:

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

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

真正的问题是: 是使用接口还是使用基类。

在 C # 中,抽象类(一个标有关键字“抽象”的类)仅仅是一个不能实例化对象的类。这与简单地区分基类和接口有着不同的用途。

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

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

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

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