假设我们有两个方法M1()
和M2()
一个接口。一个抽象类也有同样的两个抽象方法。如果任何类实现了此接口或继承自抽象类,则必须实现其中的两个方法。
所以对我来说,似乎接口或抽象类在我的场景中表现相同。那么,任何人都可以在这种特定情况下强调这两者之间的区别,并建议在这里使用抽象类还是接口?
假设我们有两个方法M1()
和M2()
一个接口。一个抽象类也有同样的两个抽象方法。如果任何类实现了此接口或继承自抽象类,则必须实现其中的两个方法。
所以对我来说,似乎接口或抽象类在我的场景中表现相同。那么,任何人都可以在这种特定情况下强调这两者之间的区别,并建议在这里使用抽象类还是接口?
抽象类和接口之间存在技术差异,抽象类可以包含方法、字段、构造函数等的实现,而接口仅包含方法和属性原型。一个类可以实现多个接口,但它只能继承一个类(抽象或其他)。
但是,在我看来,接口和抽象类之间最重要的区别是语义上的区别。
接口定义了某物可以做什么(它的行为方式),而抽象类定义了某物是什么。
举个例子IEnumerable
,这背后的语义是任何实现的东西IEnumerable
都是可枚举的,这并不意味着它是一个枚举,而是它可以表现得像一个(可以枚举)。
与洗衣机的例子相比,任何继承它的东西都是一种洗衣机。任何继承它的东西都是洗衣机、顶部装载机或侧装载机等。
相反,如果你有一个名为 的接口ICanWash
,它可能包含一个名为 的方法Wash
。您可以实现各种事物ICanWash
,无论是 a Person
,抽象洗衣机类等,实际实现并不重要,您只需要知道行为是它可以洗涤事物。
总而言之,类定义了某物是什么,接口定义了某物可以做什么。
来自MSDN:
例如,通过使用接口,您可以在一个类中包含来自多个来源的行为。该功能在 C# 中很重要, 因为该语言不支持类的多重继承
因此,如果您希望任何类都可以继承该方法,请使用接口。
从同一个 MSDN 页面:
此外,如果要模拟结构的继承,则必须使用接口,因为它们实际上不能从另一个结构或类继承。
接口允许一个类继承/实现多个接口,而在 C# 中,您只能从一个类继承。
基本上是多重继承。
抽象类不仅包含抽象方法,它还可以包含其他具有实现的字段和方法。在 C# 中,您不能从多个类继承,但您可以实现多个接口。所以简短的回答是:尽可能使用接口而不是抽象类。在您的示例中,建议使用接口。
关于接口和抽象类之间差异的两个快速思考: