关于C#:抽象类和接口有什么区别?

What's the difference between an abstract class and an interface?

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

假设我们在一个接口中有两个方法M1()M2()。抽象类也有相同的两个抽象方法。如果任何类实现了这个接口或继承了抽象类,那么它将必须实现其中的两个方法。

因此,在我看来,对于我的场景,接口或抽象类的行为是相同的。那么,在这种特定的情况下,是否有人能强调这两者之间的区别,并建议在这里使用抽象类还是接口?


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

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

接口定义了什么东西可以做(它的行为方式),抽象类定义了什么东西。

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

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

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

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


来自MSDN:

By using interfaces, you can, for example, include behavior from
multiple sources in a class. That capability is important in C#
because the language doesn't support multiple inheritance of classes

因此,如果希望任何类都可以继承该方法,请使用Interface。

来自同一个msdn页面:

In addition, you must use an interface if you want to simulate
inheritance for structs, because they can't actually inherit from
another struct or class.


关于接口和抽象类之间区别的两个快速思考:

  • 如果将来可能扩展,则需要抽象类,作为抽象类可以扩展,但接口必须通过添加另一个接口I2增强。
  • 单一(实现)继承意味着选择抽象类细心地,最能反映真实的本质。界面可以很容易地添加到一个实现中,但抽象类可以只有在尚未添加的情况下才添加。

  • 抽象类不仅包含抽象方法,还可以包含其他带有实现的字段和方法。在C中,您不能从多规则类继承,但可以实现多规则接口。所以简单的答案是:尽可能使用接口而不是抽象类。在您的示例中,有可能-建议使用接口。


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

    基本上是多重继承。