C#语言中的抽象类和接口


Abstract classes and interfaces in C#

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
Interface vs Base class
Interface or abstract class?

嗨,大家好,

我只是在想抽象类和接口,我知道它们在技术上是如何工作的,但是我不理解抽象类和接口的真正用途。我的意思是,当我们知道我们不能创建抽象类的对象时,为什么要使用抽象类,我们无论如何都必须扩展这个类来使用它,所以为什么不把所有东西都放在派生类中呢?

与接口相同,我们必须实现接口,所以为什么不把接口中定义的所有方法都放在我们实现接口的类中呢?

有人能举例说明我的疑问吗?


StackOverflow处的链接

  • 抽象类的精确使用
  • 接口还是抽象类?
  • 抽象类与接口
  • 为什么抽象类和接口存在于.NET中?
  • 抽象类之间的差异和C中的接口#
  • 两者的区别是什么?接口和抽象类?
  • 何时使用接口而不是抽象类,反之亦然?
  • 帮助我在实践中理解示例使用抽象类vs接口?

其他

  • 抽象类与接口
  • 我应该使用抽象类还是接口?
  • 接口上的抽象基类
  • 学习:何时使用摘要类和接口
  • 抽象类的建议vs.接口-msdn
  • 使用抽象类,密封类和C中的接口#
  • 抽象类与C(.NET)中的接口


同样需要注意的是,在C中,您只能继承一个类,但可以继承多个接口。抽象类是具有多个子类可重用代码的类的部分实现。一个接口就是一个特定用途的对象接口。

一个很好的例子就是游戏中的对象。如果对象是可绘制和可碰撞的,那么您可能有一些公共例程来处理它,但没有公共的基类,因此您有了类实现idrawable和icollizable。


当有多个派生类共享相同的抽象行为时,您会怎么做?

举个好例子,考虑一下.NET中的Stream类。


简单地说,您使用抽象类来建模继承,就像汽车继承自汽车一样。通常,您也将继承一些实现或类定义。

接口用于对可能具有类似行为子集但不必要的IS-A关系的类型进行建模。例如,我可以有一个接口i validate,它有一个方法validate,这个方法可以通过car、student、account等实现,以验证它们所保存的数据。这些类型不能/不应该真正建模为IS-A关系

在不支持多重继承作为解决方法的语言中,接口也被广泛使用。其他用途包括依赖项分离,以及在COM和WCF中公开服务。


接口意味着您可以定义一个类应该实现的方法,而不需要实际实现它们。这一点之所以有用的一个例子是允许开发人员为您的应用程序编写插件。

必须明确哪些方法可以在此插件上调用(例如,加载、卸载、执行),但这些方法的实现方式取决于插件本身。在设计接口时,您可能不知道这些方法的代码实际上是什么。

就抽象类而言,尽管相似类通常用作类似类的基础。对于流基类,它有一个读取字节块的方法,可以通过重复调用方法来调用单个字节来读取字节块。如果有几个类是从这个基类派生的,则不必在每个类中重复这段代码;因此抽象类通常用于减少代码重复


在我的工作中,当我想为特定类型的组件创建插件时,我使用接口,这些组件需要被应用程序以相同的方式处理,但它们的行为是特定于组件的。在其他情况下,我希望在派生类之间有一些共同的行为,所以我使用一个抽象类来定义派生类需要实现的方法,但是我只需要在必要时实现特定于组件的行为。


我一直使用抽象类作为派生类的路线图。很多时候,我会有一系列的类,它们都是相似的,并且能够共享功能,但是它们都会非常不同,以至于它们需要自己的类。因此,基类并不是完全功能性的,它有一些为特定类设计的方法。因此,通过将其声明为抽象的,您可以将功能放在名称空间中以供一般使用,但是您仍然能够将其使用限制在这组类中。

接口(对我来说)不过是一个蓝图而已。我从来都不需要接口,但是当发布可扩展的API或在组织内构建框架时,接口是可扩展类应该如何工作的良好蓝图。它有助于在命名空间中为特定对象集所需的功能定义一个标准。

我认为两者都不是特别必要的,但是它们在隔离代码和定义如何使用和/或扩展代码方面非常有用。