接口与抽象类

tus*_*h1r 120 c# inheritance abstract-class interface

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

Jar*_*Par 136

抽象类的优点是:

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

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

  • @Brann,我很遗憾地看到过这种行为.似乎在OP上使用向下投票会更有意义.搜索欺骗是他们的责任. (13认同)
  • @Matt答案提供了抽象类和接口的所有相关事实,那为什么它不是客观的呢?我认为这是一个非常好的答案. (4认同)
  • 我很惊讶这个答案有很多赞成,是接受的答案.它似乎表明了回答者的偏见("抽象类的优势",其次是四个优点,其次是"接口只是",然后是一个"然而"支持接口),而不是真正描述它们之间的差异.抽象类和接口.我并不是要攻击回答者,但当然应该以更客观的方式说明这个问题,以便对问题做出最好的判断. (3认同)

Guf*_*ffa 79

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

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

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


Zif*_*fre 8

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


Dav*_*nde 5

真正的问题是:是否使用接口或基类.这已经包含在内了.

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