C# 什么';抽象类和接口之间的区别是什么?

C# 什么';抽象类和接口之间的区别是什么?,c#,oop,interface,abstract-class,C#,Oop,Interface,Abstract Class,假设我们在一个接口中有两个方法M1()和M2()。一个抽象类也有两个相同的抽象方法。如果任何类实现了该接口或继承自抽象类,则必须实现其中的两个方法 因此,在我看来,接口或抽象类在我的场景中的行为是相同的。那么,在这个特定的例子中,有谁能强调这两个之间的区别,并建议在这里使用抽象类还是接口 接口允许一个类继承/实现多个接口,而在C#中只能从一个类继承 基本上是多重继承。抽象类和接口之间有技术上的区别,抽象类可以包含方法、字段、构造函数等的实现,而接口只包含方法和属性原型。一个类可以实现多个接口,但

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


因此,在我看来,接口或抽象类在我的场景中的行为是相同的。那么,在这个特定的例子中,有谁能强调这两个之间的区别,并建议在这里使用抽象类还是接口

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


基本上是多重继承。

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

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

接口定义了某些东西可以做什么(它的行为),抽象类定义了某些东西是什么

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

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

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


总之,类定义事物的本质,接口定义事物的功能。

抽象类不仅包含抽象方法,还可以包含其他字段和方法。在c#中,您不能从多模块类继承,但可以实现多模块接口。因此,简单的答案是: 尽可能使用接口,而不是抽象类。
在您的示例中,建议使用接口是可能的。

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

  • 如果将来可能扩展,则需要抽象类,例如 抽象类可以扩展,但必须扩展接口 通过添加另一个接口I2增强
  • 单一(实现)继承意味着选择抽象类 仔细地,最贴切地反映真实的基本本质。接口 可以轻松地添加到实现中,但抽象类可以 只有在尚未添加的情况下才可以添加
  • 发件人:

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

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

    从同一MSDN页面:

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


    哈也许我们可以把所有同时出现的问题结合起来,分享这个代表;-)你能详细阐述一下你的想法吗?假设我有一个接口IMath,它包含两个方法AddNumbers()&ConcatenateStrings()。这两个抽象方法也在抽象类Math中。现在你能建议我应该使用IMath还是Math吗?假设目前对它的继承没有明确的要求,那么选择哪一个?更多示例:如果你想创建一个其他类可以实现的方法/属性,那么使用接口。但请记住,当您在接口中添加/删除方法时,必须在实现该接口的所有类中执行相同的操作。在抽象类中,您可以添加/删除方法,这会影响继承抽象类的所有类。因此,我在本讨论中的最后一点是:1。接口定义了某些东西可以做什么(它的行为),抽象类定义了某些东西是什么。2.尽可能使用接口,而不是抽象类。原因:如果您有一个已经实现了一些接口的类&继承一个类。因此,在这种情况下,这个类将无法继承您的抽象类,因为多重继承受到限制。但若它想要实现接口,那个么就并没有问题了。非常正确,但若你们实现了一个接口(在类声明中),你们必须对它进行编码——别无选择。只是澄清一下以防万一。这就是我要找的。非常好的观点,因为我认为这就是OOP的全部内容。