c# - 抽象类或接口(interface)。哪种方式是正确的?

标签 c# java .net interface abstract-class

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


Microsoft,设计指南:

使用抽象类(在 Visual Basic 中必须继承)而不是接口(interface)来将契约与实现分离。

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


Oracle,Java 教程:

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

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


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

最佳答案

如果我没记错我的博客阅读内容,Microsoft 使用抽象类的建议源于使用抽象类重用实现的能力,这是接口(interface)无法做到的。

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

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

  • 定义一个接口(interface)来指定合约
  • 创建一个实现契约的抽象类,以提供对所有后代有用的任何通用实现
  • 为了方便起见,合约的实现可以选择从基类开始,或者如果他们想要完全控制则只实现接口(interface)

.NET 世界中常见的第四步是提供构建在接口(interface)上的便利扩展功能。

关于c# - 抽象类或接口(interface)。哪种方式是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243589/

相关文章:

c# - 如果我等待一个已经在运行或运行的任务,会发生什么?

c# - 索引超出范围。必须为非负数且小于集合的大小。参数名称 : index

c# - 定义一个lambda函数并立即执行

c# - 我如何在 Linq 中分组?

java - 如何正确访问静态成员类?

c# - 是否有文件字节的 .NET 包装器?

c# - Web API 2 自定义身份验证

java - 无法使用 Eclipse 创建 GIT 存储库

java - 包含按位与 (&) 或按位异或 (^) 的运算是否有等价的十进制运算?

C# 枚举 - 根据掩码检查标志