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

时间:2013-03-02 19:04:54

标签: c# oop interface abstract-class

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

所以对我来说,似乎我的场景中的接口或抽象类的行为相同。那么,任何人都可以突出显示这两个在这个特定情况下之间的区别,并建议是否在这里使用抽象类或接口?

5 个答案:

答案 0 :(得分:115)

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

但是,在我看来,Interfaces和Abstract Classes之间最重要的区别是语义差异。

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

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

washing machine example相比,任何继承它的东西都是一种洗衣机。任何继承它的东西都是洗衣机,顶部装载机或侧面装载机等。

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

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

答案 1 :(得分:3)

来自MSDN

  

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

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

从相同的MSDN页面:

  

此外,如果要模拟,必须使用界面   结构的继承,因为它们实际上不能继承   另一个结构或类。

答案 2 :(得分:1)

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

基本上是多重继承。

答案 3 :(得分:1)

抽象类不仅包含抽象方法,还可以包含其他实现方法和方法。在c#中,您不能从multipule类继承,但可以实现multipule接口。简而言之就是: 尽可能使用接口而不是抽象类。 在您的示例中,可以建议使用界面。

答案 4 :(得分:1)

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

  1. 如果未来可能扩展,则需要抽象类 抽象类可以扩展,但接口必须是 通过添加另一个接口I2增强。
  2. 单个(实现)继承意味着选择抽象类 谨慎地,最贴心地反映真实的基本性质。接口 可以很容易地添加到实现中,但抽象类可以 只有在没有人的情况下才会被添加。