抽象类和接口有什么区别?

假设在一个接口中有两个方法M1()M2() 。 一个抽象类也有两个相同的抽象方法。 如果任何类实现了这个接口或从抽象类inheritance,它将不得不实现其中的两个方法。

所以对我来说,接口或抽象类对于我的场景来说似乎是相同的。 那么,有没有人可以在这个特定的情况下突出这两者之间的差异,并build议在这里使用抽象类还是接口?

抽象类和接口之间存在技术差异,作为抽象类可以包含方法,字段,构造函数等的实现,而接口只包含方法和属性原型。 一个类可以实现多个接口,但它只能inheritance一个类(抽象或其他)。

然而,在我看来,接口和抽象类最重要的区别是语义上的差异。

一个接口定义了什么可以做 (它如何performance的),一个抽象类定义了什么是。

IEnumerable为例,其背后的语义意义是任何实现IEnumerable东西都是可枚举的,并不意味着它是一个枚举,而是可以像一个枚举(可以枚举)。

与洗衣机的例子相比 ,任何inheritance它的东西都是一种洗衣机。 任何inheritance它的东西都会是一台洗衣机,一台顶部装载机或侧面装载机等等。

相反,如果你有一个名为ICanWash的接口,可以包含一个叫做Wash的方法。 你可以有各种各样的东西来实现ICanWash ,无论是一个Person ,一个抽象的洗衣机类,等等,其实际的实现并不重要,只需要知道它的行为就是可以洗的东西。

总之,类定义了什么是接口定义了什么可以做的事情。

来自MSDN :

通过使用接口,例如,可以包含来自一个类中多个来源的行为。 这种能力在C#中很重要, 因为这种语言不支持类的多重inheritance

所以,如果你希望任何类都可以inheritance那个方法,那就使用接口。

从相同的MSDN页面:

另外,如果你想模拟结构的inheritance,你必须使用一个接口,因为它们实际上不能从另一个结构或类inheritance。

接口允许类inheritance/实现多个接口,而在C#中,只能从一个类inheritance。

基本上是多重inheritance。

抽象类不仅包含抽象方法,还可以实现其他领域和方法。 在c#中,你不能从multipule类inheritance,但你可以实现multipule接口。 所以简短的答案是:尽可能使用接口而不是抽象类。 在你的例子中,它是possibe – 并build议使用一个接口。

关于接口和抽象类之间差异的两个简单的想法:

  1. 如果将来可能扩展,抽象类是可取的,因为抽象类可以扩展,但是通过添加另一个接口I2可以增强接口。
  2. 单一(实现)inheritance意味着要认真select抽象类,最贴近地反映真实的基本性质。 接口可以方便地添加到实现中,但只有在没有一个抽象类时才能添加抽象类。