【问题标题】:What is the difference between abstract class and interface in .NET?.NET 中的抽象类和接口有什么区别?
【发布时间】:2010-12-12 04:51:04
【问题描述】:

一个抽象类可以被另一个类继承,需要人重写抽象函数、抽象属性等。

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

我发现的唯一不同是 Visual Studio 足够智能,可以自动生成此界面的必要成员。

那么,有什么不同呢?

谢谢~

【问题讨论】:

标签: .net interface abstract-class


【解决方案1】:

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

我希望我说清楚了:))

【讨论】:

    【解决方案2】:

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

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

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

    由于语言限制,这又会导致一些实际差异(例如,C# 不支持多重继承,除了接口)。使用哪个实际上取决于您要实现的目标。

    【讨论】:

    • 你不会继承接口,是吗?我以为你实现了一个接口......(虽然可能是错的)
    • 是的,你是对的。您从基类继承,并实现接口。实际上,这两个词用于区分基类/派生类关系的性质。我只是这样描述它,所以我没有让任何人跳起来说“C#支持接口的多重继承”。但我在这里也可能错了......
    【解决方案3】:

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

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

    【讨论】:

    • 单一继承适用于所有 .NET 语言。
    【解决方案4】:

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

    【讨论】:

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

      【讨论】:

      • 另外,c# 中的接口类似于 C++ 中的纯虚拟类。
      猜你喜欢
      • 2010-12-27
      • 2018-10-11
      • 2010-11-13
      • 2013-02-17
      • 1970-01-01
      • 2012-04-28
      • 2019-12-14
      相关资源
      最近更新 更多