C#中的抽象类和接口

时间:2010-02-22 04:28:29

标签: c#

  

可能重复:
  Interface vs Base class
  Interface or abstract class?

大家好,

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

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

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

7 个答案:

答案 0 :(得分:16)

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

简单来说,您可以使用抽象类来建模继承,例如Car继承自Vehicle。通常,您也将继承一些实现或类定义。

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

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