2012-02-20 93 views
3

有时候我在想,我们确实有两个不同的原因接口和抽象类:类层次结构设计 - 接口+基类与抽象类

  1. 如果你只是想为设计目的和东西多种实现代码反对在开发时,接口是我们得到的最佳选择。

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

但是,我已经看到了一个既不是。

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

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

回答

9

最简单的就是如果一个对象有一个IS-A关系然后使用一个(抽象)基类。像马一样是动物。

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

+1

这是一个非常简洁易记的答案 – 2014-12-03 10:58:59

3

可以使用接口将多个接口实现为一个类。你不能从C#中的多个类派生。

2

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

3

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

有一个抽象类确实定义了一些指定的行为,这是你不希望总是的东西。

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

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

2

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

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

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

在这种情况下,没有真正的原因为什么同时使用抽象类以及接口不应该被使用。这一切都取决于你的目的以及你如何构建你的代码。

2

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

0

的接口主要规则是

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

因为这是一个c#线程,所有这些都由IDE在您声明某个接口时实施。 – Void 2016-05-31 10:37:04