代码之家  ›  专栏  ›  技术社区  ›  Anil Namde

如何决定是使用接口还是抽象类?

  •  7
  • Anil Namde  · 技术社区  · 14 年前

    我已经对C很感兴趣,总是觉得接口和抽象类之间应该选择什么是混淆的。有人能帮忙解决这个问题吗?

    谢谢,

    5 回复  |  直到 14 年前
        1
  •  8
  •   dcp    14 年前

    把一个接口想象成 contract ,您正在指定希望该接口的使用者实现的内容。

    另一方面,抽象类在 一些 您需要为类实现的代码,但不是所有代码。您可以为需要由抽象类的子类实现的部分声明抽象方法。记住抽象方法 必须 由子类实现,但也可以通过普通的private/public/protected/etc.方法在类内部提供自己的代码。

    所以,如果您只是在编写一个您希望子类实现的契约,那么可以考虑接口。但是如果你写的东西更多的是一个“模式”,你可能有一些方法实现(但不是全部),这些方法实现对所有的子实现都是通用的,那么你应该考虑抽象类。

        2
  •  6
  •   JSBÕ±Õ¸Õ£Õ¹    14 年前

    两者都不是“更好”——它们有不同的目的。

    • 界面 当您需要定义一组具有相似语义的公共方法时,可以使用,但是定义这些方法的类不能从同一个源继承,并且可能具有完全不同的实现。

    • 抽象类 当您希望部分实现某些功能,但将重要部分委托给子类时。抽象类的实现比接口的实现受到更大的限制,因为实现类必须从抽象类继承,并且它们不能重写不是 virtual abstract .

        3
  •  2
  •   Dan Bryant    14 年前

    这取决于你想做什么。当您具有具有公共状态的公共功能时,抽象类是很好的。即使使用抽象类,提供接口通常也很有帮助,因为您并不总是需要访问状态,而其他类可能在没有该状态的情况下实现接口(例如测试存根)。

    如果您只需要helper方法(没有状态,只需要组成方法调用),那么我更喜欢为helper函数使用带有扩展方法的接口(例如重载)。

        4
  •  1
  •   Brian Gideon    14 年前

    已经有了一些代码答案,但我想添加另一个许多开发人员忘记的视角。

    如果在公共API中使用接口,那么您已经将自己提交给它包含的那些成员,并且只提交给那些成员。如果您试图向接口添加某些内容,那么这是一个破坏版本的更改。为什么?因为每个类都必须实现接口中的每个成员。使用API的代码将停止编译。

    抽象类不受这种限制,因为您可以添加方法并为它们提供合理的默认实现。这样子类就不明智了,也不会受到变化的影响。

        5
  •  0
  •   Matt Greer    14 年前

    抽象基类最好在内部使用,以满足您自己的需要。当你在写一些需要与他人代码接口的东西时,接口会更好。主要原因是C不支持多重继承。

    例如,如果您提供 PluginBase 抽象您希望消费者子类为您的系统提供插件的基类,您已经将它们强制到您的基类中,并严格限制了它们。安 IPlugin 界面更加灵活。