.NET中的抽象类和接口有什么区别?

时间:2009-11-02 07:05:47

标签: .net interface abstract-class

抽象类可以由另一个类继承,并要求人们覆盖抽象函数,抽象属性等。

一个接口也可以由另一个类实现,也需要人们实现函数,属性,索引器等。

我发现唯一不同的是Visual Studio足够聪明,可以自动生成此接口的必要成员。

那么,有什么不同?

谢谢你〜

5 个答案:

答案 0 :(得分:5)

从概念上讲,我看到了一个简单的区别。

接口定义了对类的期望。它声明实现者必须提供某些行为(方法,属性,事件)。它没有规定一个类应该如何工作,只是它应该做什么

抽象类是一个无法单独实例化的基类。通常它提供了一个部分实现,可以在从它派生的具体类之间共享。因此,它规定一个类应该如何

由于语言限制,这反过来导致了一些实际差异(例如,C#不支持多重继承,除了接口)。使用哪个真正取决于你想要达到的目标。

答案 1 :(得分:1)

  • 您可以使用抽象类提供部分实现。
  • 接口不会破坏继承线;抽象类做。您可能希望在不创建is-a关系的情况下强制执行行为/功能。

答案 2 :(得分:1)

在.NET中,类仅限于单继承,但可以实现任意数量的接口。如果从一个抽象类继承,那么这是唯一可以使用的类。这可能不是什么大不了的事,但作为一个例子,它可能会阻止你继续从MarshalByRefObject继承。

此外,抽象类定义的行为仅限于从其继承的类。另一方面,接口定义的行为(IDisposable,IPrintable等)可以跨类层次结构应用。

答案 3 :(得分:0)

接口根本没有实现,但抽象类可以实现方法和属性。

答案 4 :(得分:0)

添加到@Jeremy简短明了的答案:) 抽象类将具有“抽象”和“虚拟”关键字,这些关键字将指定方法或属性是否具有实现。 抽象方法/属性必须在具体类中实现,但虚拟方法/属性可能在具体类中被覆盖,因为它已经在抽象类中具有实现... < / p>

我希望自己明确表示:))