类层次结构设计 - 接口+基类与抽象类

时间:2012-02-20 15:15:07

标签: c# oop

有时候我想知道我们确实有接口和抽象类,原因有两个:

  1. 如果您只是想在设计目的下进行多项实施,而在开发时需要进行编码,那么界面是我们的最佳选择。

  2. 如果你想重用代码,我们可能会去抽象类。

  3. 但是,我看到的东西都不是。

    在某些设计中,它就像这个Interface > BaseClass > Child类。

    基本上,基类实现所有方法,然后子类从中继承定义。为什么我们不能使用抽象类而不是这个设置?或者这是一个有缺陷的设置?

8 个答案:

答案 0 :(得分:10)

最简单的方法是,如果对象具有IS-A关系,则使用(抽象)基类。像马一样是一种动物。

如果存在CAN关系,那么考虑接口,就像Duck CAN飞行一样,使用IFlying作为可以飞行的鸭子的接口。

答案 1 :(得分:3)

接口可用于将多个接口实现到一个类中。您无法从C#中的多个类派生。

答案 2 :(得分:3)

本网站上发布的关于Abstract classes and interfaces的答案将帮助您了解设计差异。

答案 3 :(得分:3)

这是设计和个人品味的问题,通常当你声明一个你并不真正关心具体实现的界面时,你只关心界面应该提供的包装功能。

有一个抽象类确实定义了一些指定的行为,这是你不想要的。

同时有抽象类会禁止你继承多个,所以这会限制它可以拥有的功能。

在设计类层次结构时,你会问自己“在这种情况下应该使用什么对象?”并为该功能定义一个接口,然后,在提供实现的同时,您可以意识到某些功能应该被分组并重用于某些子类,但它会在以后出现。

答案 4 :(得分:2)

这是由于C#中禁止多重继承类。但它允许实现多个接口。

答案 5 :(得分:2)

接口本质上是一个功能的契约;指定某些方法和属性。可以在不知道实现细节的情况下针对此接口编写代码段。

抽象类可以实现某些接口,但它也可能包含所有派生类型可能需要的一些常用功能。它还可能包含抽象或虚拟方法/属性,允许派生类型自定义某些功能。

考虑一个场景,您构建一些对象模型,您编写代码,使用接口来定义所述模型的结构,但是您希望允许该代码的使用者在他们希望的情况下编写自己的实现,而不会影响核心设计。然后,您可以使用一些基类为一个实现构建自己的实现。然后,派生类型将继承此基类,该基类又实现对象模型的接口。然后其他人可能会出现并编写自己的实现,但需要一些与现有实现不同的功能或行为。因此,他们使用自己的通用功能编写自己的基类,并使用自己的派生类型进行扩展。

在这种情况下,没有真正的理由说明不应该使用抽象类以及接口。这一切都取决于您的目的以及如何构建代码。

答案 6 :(得分:2)

接口定义了一组必须实现的属性和功能,并且可以由任意数量的类来实现。基类没有理由不应该实现接口。例如,许多不同的基类可能使用IComparable。

答案 7 :(得分:0)

界面的主要规则是

  1. 所有方法都应该是抽象的
  2. 没有实施
  3. 接口可以扩展任意数量的接口
  4. 所有字段都应该是公开的,静态的和最终的
  5. 应在继承的类
  6. 中覆盖所有方法