C#中的抽象类和接口

可能重复:
接口与基类
接口还是抽象类?

大家好,

我只是在思考抽象类和接口,我知道它们在技术上是如何工作的,但我不了解抽象类和接口的实际用途。 我的意思是,当我们知道无法创建它的对象时,为什么我们应该使用抽象类,我们不得不扩展这个类来使用它,所以为什么我们不把所有东西都放在派生类中。

接口也一样,我们必须实现接口,所以为什么我们不把接口中定义的所有方法都放在我们实现接口的类中。

有人可以用一些例子清楚我的怀疑吗?

Stackoverflow的链接

  • 确切使用Abstract类
  • 接口还是抽象类?
  • 抽象类与接口
  • 为什么.Net中都存在抽象类和接口?
  • C#中抽象类和接口之间的差异
  • 接口和抽象类有什么区别?
  • 何时使用接口而不是抽象类,反之亦然?
  • 帮助我理解一个实际的例子,使用抽象类和接口?

其他

  • 抽象类与接口
  • 我应该使用抽象类还是接口?
  • 接口上的抽象基类
  • 学习:何时使用抽象类和接口
  • 关于抽象类与接口的建议 – MSDN
  • 在C#中使用抽象类,密封类和接口
  • C#(。Net)中抽象类和接口的区别

另外值得注意的是,在C#中,您只能inheritance一个类但只能inheritance多个接口。 抽象类是具有多个子类的可重用代码的类的部分实现。 接口只是用于特定目的的对象接口。

一个很好的例子就是游戏中的物体。 如果对象是Drawable和Collideable,你可能有常见的例程来处理它但没有公共基类,所以你有类实现IDrawable和ICollidable。

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

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

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

接口(对我而言)只不过是蓝图。 我从来不需要接口,但是当发布可扩展的API或在组织内构建框架时,接口是可扩展类应该如何表现的良好蓝图。 它有助于在命名空间内为特定对象集合所期望的function定义标准。

我想说两者都没有特别必要,但它们在隔离代码和定义代码的使用和/或扩展方面非常有用。

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

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

必须清楚可以在这个插件上调用哪些方法(例如load,unload execute),但是如何实现这些方法取决于插件本身。 在设计界面时,您可能不知道这些方法的代码实际上是什么。

就抽象类而言,虽然类似,但通常用作类似类的基础。 在Stream基类的情况下,它有一个读取字节块的方法,它可以通过重复调用一个方法调用单个字节来完成。 如果你有几个派生自这个基类的类,你就不必在每个类中重复这个代码; 所以抽象类通常用于减少代码重复

简单来说,您可以使用抽象类来模拟inheritance,例如Car从Vehicleinheritance。 通常,您也将inheritance一些实现或类定义。

接口用于对可能具有类似行为子集的类型进行建模,但不是必需的关系。 例如,我可以有一个接口IValidate,它有一个方法Validate,这可以由Car,Student,Account等实现,以validation它们持有​​的数据。 这些类型不能真正建模为关系

接口也广泛用于不支持多inheritance作为变通方法的语言。 其他用途包括依赖项分离,以及在COM和WCF中公开服务。