繁体   English   中英

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

[英]Class hierarchy design - interfaces + base class vs. abstract class

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

  1. 如果您只是为了设计目的而需要多个实现,并且在开发时需要编写代码,那么接口是我们获得的最佳选择。

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

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

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

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

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

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

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

本网站上发布的关于抽象类和接口的答案将帮助您了解设计差异。

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

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

同时,具有抽象类将禁止您继承多个,因此这将限制它可以具有的功能。

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

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

接口本质上是一个功能的契约; 指定某些方法和属性。 可以针对此接口编写代码段,而无需了解实现细节。

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

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

在此之后的场景,还有就是为什么不应使用同时使用一个抽象类接口,并没有真正的理由。 这一切都取决于您的目的以及您如何构建代码。

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

接口的主要规则是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM