抽象类或接口.哪种方式是正确的?

Ami*_*yan 8 .net c# java abstract-class interface

在抽象类或接口之间进行选择有两种方法.Microsoft解决方案和Oracle解决方案:


微软,设计指南:

使用抽象(Visual Basic中的MustInherit)类而不是接口来将合同与实现分离.

http://msdn.microsoft.com/en-us/library/ms229013.aspx


Oracle,Java教程:

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

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html


我的问题是哪种方式是正确的?Microsoft或Oracle解决方案?请注意,我认为抽象类或接口之间的选择不应该依赖于编程语言(Java或C#).

Bev*_*van 10

如果我回想起我的博客正确阅读,微软使用抽象类的建议源于使用抽象类重用实现的能力,这是接口无法做到的.

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

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

  • 定义用于指定合同的接口
  • 创建一个实现契约的抽象类,以提供对所有后代有用的任何常见实现
  • 然后,合同的实现可以选择从基类开始以方便使用,或者只是在需要完全控制时实现接口

.NET世界中常见的第四步是提供基于接口构建的便利扩展功能.


Hen*_*man 7

对于不同的上下文,它们是2个语句.

您引用的Microsoft指南适用于"设计类库".它说明了在那里支持抽象类的原因:你可以添加功能而不会破坏任何东西.

对于层和其他边界的分离和解耦,Microsoft也建议接口.