【问题标题】:Abstract class or interface. Which way is correct?抽象类或接口。哪种方式是正确的?
【发布时间】:2012-03-03 20:31:52
【问题描述】:

有两种方法可以在抽象类或接口之间进行选择。 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


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

【问题讨论】:

    标签: c# java .net interface abstract-class


    【解决方案1】:

    如果我记得我的博客没看错的话,微软关于使用抽象类的建议源于使用抽象类重用实现的能力,这是你不能用接口做的。

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

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

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

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

    【讨论】:

    • +1 “在单一产品或系统上工作的良好做法会有所不同”
    【解决方案2】:

    它们是针对不同上下文的 2 个语句。

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

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

    【讨论】:

    • +1 - 这说明了微软推荐的关键原因。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 2010-12-21
      • 2012-05-01
      • 1970-01-01
      • 2011-05-22
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多