C# 抽象类或接口。哪条路正确?

C# 抽象类或接口。哪条路正确?,c#,java,.net,interface,abstract-class,C#,Java,.net,Interface,Abstract Class,在抽象类和接口之间有两种选择方式。Microsoft解决方案和Oracle解决方案: 微软,设计指南: 一定要使用抽象类(在Visual Basic中为MustInherit)而不是接口来将契约与实现解耦。 Oracle,Java教程: 如果抽象类只包含抽象方法声明,则应将其声明为接口。 我的问题是哪条路是正确的?Microsoft还是Oracle解决方案?请注意,我认为在抽象类或接口之间进行选择不应取决于编程语言(Java或C#)。如果我记得我的博客读得没错,Microsoft关于使

在抽象类和接口之间有两种选择方式。Microsoft解决方案和Oracle解决方案:


微软,设计指南:

一定要使用抽象类(在Visual Basic中为MustInherit)而不是接口来将契约与实现解耦。


Oracle,Java教程:

如果抽象类只包含抽象方法声明,则应将其声明为接口。



我的问题是哪条路是正确的?Microsoft还是Oracle解决方案?请注意,我认为在抽象类或接口之间进行选择不应取决于编程语言(Java或C#)。

如果我记得我的博客读得没错,Microsoft关于使用抽象类的建议源于对抽象类重用实现的能力,这是接口所不能做到的

还请注意,您链接到的Microsoft页面专门用于编写代码库,以便跨多个项目共享/重用。在这种情况下,很可能您将自己编写接口的所有实现,可能在同一个程序集中。单一产品或系统的良好实践会有所不同

我在许多语言的许多代码库中看到的一种常见方法是:

  • 定义一个接口来指定合同
  • 创建一个实现契约的抽象类,以提供对所有子体都有用的任何通用实现
  • 为了方便起见,契约的实现可以选择从基类开始,如果想要完全控制的话,也可以只实现接口

NET世界中常见的第四步是提供基于接口的方便的扩展功能。

接口没有实现——它是一个契约。它允许完全解耦

如果我想提供一些通用实现,同时强制继承类concrete类提供特定于该类的实现,那么我将从一个接口转到一个抽象(基类)类。这就少了一点解耦


还要注意,许多语言,如C#(和.net语言,如VB.net等)以及Java不允许多重继承,因此接口成为允许类具有多种行为的一种方式。

它们是针对不同上下文的两条语句

您引用的Microsoft指南用于“设计类库”。它说明了支持抽象类的原因:您可以在不破坏任何东西的情况下添加功能


对于层和其他边界上的分离和解耦,Microsoft还建议使用接口

+1-这说明了Microsoft推荐的主要原因。+1“在单个产品或系统上工作的良好实践会有所不同”