关于C#:接口与抽象类

Interfaces vs. abstract classes

本问题已经有最佳答案,请猛点这里访问。

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


抽象类的优点是:

  • 能够指定方法的默认实现
  • 为函数添加了不变检查
  • 对"接口"方法的调用方式有一点控制
  • 能够为"免费"提供与接口相关或无关的行为

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


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

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

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


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


真正的问题是:是使用接口还是使用基类。这一点以前已经讨论过了。

在C中,抽象类(用关键字"abstract"标记的类)只是一个不能从中实例化对象的类。这与简单地区分基类和接口不同。