C# 什么';抽象类和接口之间的区别是什么?
假设我们在一个接口中有两个方法C# 什么';抽象类和接口之间的区别是什么?,c#,oop,interface,abstract-class,C#,Oop,Interface,Abstract Class,假设我们在一个接口中有两个方法M1()和M2()。一个抽象类也有两个相同的抽象方法。如果任何类实现了该接口或继承自抽象类,则必须实现其中的两个方法 因此,在我看来,接口或抽象类在我的场景中的行为是相同的。那么,在这个特定的例子中,有谁能强调这两个之间的区别,并建议在这里使用抽象类还是接口 接口允许一个类继承/实现多个接口,而在C#中只能从一个类继承 基本上是多重继承。抽象类和接口之间有技术上的区别,抽象类可以包含方法、字段、构造函数等的实现,而接口只包含方法和属性原型。一个类可以实现多个接口,但
M1()
和M2()
。一个抽象类也有两个相同的抽象方法。如果任何类实现了该接口或继承自抽象类,则必须实现其中的两个方法
因此,在我看来,接口或抽象类在我的场景中的行为是相同的。那么,在这个特定的例子中,有谁能强调这两个之间的区别,并建议在这里使用抽象类还是接口 接口允许一个类继承/实现多个接口,而在C#中只能从一个类继承
基本上是多重继承。抽象类和接口之间有技术上的区别,抽象类可以包含方法、字段、构造函数等的实现,而接口只包含方法和属性原型。一个类可以实现多个接口,但它只能继承一个类(抽象类或其他类) 然而,在我看来,接口和抽象类之间最重要的区别是语义差异 接口定义了某些东西可以做什么(它的行为),抽象类定义了某些东西是什么 以
IEnumerable
为例,其背后的语义含义是实现IEnumerable
的任何东西都是可枚举的,这并不意味着它是一个枚举,但它的行为可以像枚举一样(可以枚举)
与洗衣机的例子相比,任何继承它的东西都是一种洗衣机。任何继承它的东西都将是一种洗衣机,一种顶部装载机或侧面装载机,等等
相反,如果您有一个名为ICanWash
的接口,它可能包含一个名为Wash
的方法。您可以让各种东西实现ICanWash
,无论是个人
,还是抽象洗衣机类,等等,在实际实现不重要的情况下,您只需要知道行为是它可以洗东西
总之,类定义事物的本质,接口定义事物的功能。抽象类不仅包含抽象方法,还可以包含其他字段和方法。在c#中,您不能从多模块类继承,但可以实现多模块接口。因此,简单的答案是: 尽可能使用接口,而不是抽象类。
在您的示例中,建议使用接口是可能的。关于接口和抽象类之间差异的两个快速思考:
哈也许我们可以把所有同时出现的问题结合起来,分享这个代表;-)你能详细阐述一下你的想法吗?假设我有一个接口IMath,它包含两个方法AddNumbers()&ConcatenateStrings()。这两个抽象方法也在抽象类Math中。现在你能建议我应该使用IMath还是Math吗?假设目前对它的继承没有明确的要求,那么选择哪一个?更多示例:如果你想创建一个其他类可以实现的方法/属性,那么使用接口。但请记住,当您在接口中添加/删除方法时,必须在实现该接口的所有类中执行相同的操作。在抽象类中,您可以添加/删除方法,这会影响继承抽象类的所有类。因此,我在本讨论中的最后一点是:1。接口定义了某些东西可以做什么(它的行为),抽象类定义了某些东西是什么。2.尽可能使用接口,而不是抽象类。原因:如果您有一个已经实现了一些接口的类&继承一个类。因此,在这种情况下,这个类将无法继承您的抽象类,因为多重继承受到限制。但若它想要实现接口,那个么就并没有问题了。非常正确,但若你们实现了一个接口(在类声明中),你们必须对它进行编码——别无选择。只是澄清一下以防万一。这就是我要找的。非常好的观点,因为我认为这就是OOP的全部内容。