50

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

所以对我来说,似乎接口或抽象类在我的场景中表现相同。那么,任何人都可以在这种特定情况下强调这两者之间的区别,并建议在这里使用抽象类还是接口?

4

5 回答 5

137

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

但是,在我看来,接口和抽象类之间最重要的区别是语义上的区别。

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

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

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

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

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

于 2013-03-02T19:11:16.013 回答
3

来自MSDN

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

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

从同一个 MSDN 页面:

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

于 2013-03-02T19:14:58.643 回答
1

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

基本上是多重继承。

于 2013-03-02T19:09:33.283 回答
1

抽象类不仅包含抽象方法,它还可以包含其他具有实现的字段和方法。在 C# 中,您不能从多个类继承,但您可以实现多个接口。所以简短的回答是:尽可能使用接口而不是抽象类。在您的示例中,建议使用接口。

于 2013-03-02T19:12:36.970 回答
1

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

  1. 如果将来可能扩展,则需要抽象类,因为可以扩展抽象类,但是必须通过添加另一个接口 I2 来增强接口。
  2. 单(实现)继承是指精心选择抽象类,以最贴切地反映真实的基本性质。接口可以很容易地添加到实现中,但是只有在还没有抽象类的情况下才能添加抽象类。
于 2013-03-02T19:13:11.317 回答