抽象类和接口有啥区别? [复制]
Posted
技术标签:
【中文标题】抽象类和接口有啥区别? [复制]【英文标题】:What's the difference between an abstract class and an interface? [duplicate]抽象类和接口有什么区别? [复制] 【发布时间】:2013-02-17 03:55:25 【问题描述】:假设我们在一个接口中有两个方法M1()
和M2()
。一个抽象类也有同样的两个抽象方法。如果任何类实现了该接口或继承自抽象类,则必须实现其中的两个方法。
所以对我来说,在我的场景中,接口或抽象类的行为似乎相同。那么,任何人都可以强调这两个在这种特定情况下之间的区别,并建议在这里使用抽象类还是接口?
【问题讨论】:
哈!也许我们可以结合我们所有的同时分析并分享代表。 ;-) Mate & llya 你能详细说明你的想法吗?假设我有一个接口 IMath,它包含两个方法 AddNumbers() 和 ConcatenateStrings()。这两个作为抽象方法也在抽象类 Math 中。现在你能建议我应该使用 IMath 还是 Math 吗? 【参考方案1】:抽象类和接口之间存在技术差异,抽象类可以包含方法、字段、构造函数等的实现,而接口仅包含方法和属性原型。一个类可以实现多个接口,但它只能继承一个类(抽象或其他)。
但是,在我看来,接口和抽象类之间最重要的区别是语义上的区别。
接口定义了可以做什么(它的行为方式),而抽象类定义了某物是什么。
以IEnumerable
为例,这背后的语义是任何实现IEnumerable
的东西都是可枚举的,并不意味着它是一个枚举,而是它可以表现得像一个(可以枚举)。
与洗衣机的例子相比,任何继承它的东西都是一种洗衣机。任何继承它的东西都是洗衣机、顶部装载机或侧装载机等。
相反,如果您有一个名为ICanWash
的接口,它可能包含一个名为Wash
的方法。你可以让各种东西实现ICanWash
,无论是Person
,一个抽象的洗衣机类等等,实际的实现并不重要,你只需要知道它的行为是它可以洗东西。
总而言之,类定义事物是什么,接口定义事物可以做什么。
【讨论】:
这就是我要找的。非常好的一点,因为这就是我认为的 OOP 的全部内容。【参考方案2】:来自MSDN:
例如,通过使用接口,您可以包含来自 一个类中的多个来源。这种能力在 C# 中很重要 因为该语言不支持类的多重继承
因此,如果您希望任何类都可以继承该方法,请使用接口。
来自同一 MSDN 页面:
另外,如果要模拟,必须使用接口 结构的继承,因为它们实际上不能继承自 另一个结构或类。
【讨论】:
假设目前对它的继承没有明确的要求,那么选择哪一个呢? 更多示例:如果您想创建其他类可以实现的方法/属性,请使用接口。但是请记住,当您在接口中添加/删除方法时,您必须在所有实现该方法的类中执行相同的操作。在抽象类中,您可以添加/删除方法,这会影响继承抽象类的所有类【参考方案3】:接口允许一个类继承/实现多个接口,而在 C# 中您只能从一个类继承。
基本上是多重继承。
【讨论】:
所以,我从这个讨论中得到最后的结论: 1. 接口定义了某物可以做什么(它的行为方式),一个抽象类定义了某物是什么。 2. 尽可能使用接口而不是抽象类。原因:如果你有一个类已经实现了一些接口并继承一个类。因此,在这种情况下,这个类将无法继承您的抽象类,因为多重继承受到限制。但是如果要实现接口就没有问题了。 非常正确,但是如果你实现了一个接口(在类声明中),你必须对其进行编码——别无选择。只是澄清一下以防万一。【参考方案4】:抽象类不仅包含抽象方法,它还可以包含其他具有实现的字段和方法。在 C# 中,您不能从多个类继承,但您可以实现多个接口。所以简短的回答是: 尽可能使用接口而不是抽象类。 在您的示例中,建议使用接口。
【讨论】:
【参考方案5】:关于接口和抽象类之间区别的两个快速思考:
-
如果未来可能扩展,则需要抽象类,作为
抽象类可以扩展,但接口必须是
通过添加另一个接口 I2 来增强。
单(实现)继承方式选择抽象类
仔细地,最贴近地反映真实的基本性质。接口
可以很容易地添加到实现中,但是抽象类可以
仅当还没有时才添加。
【讨论】:
以上是关于抽象类和接口有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章