【问题标题】:C++: What is a class interface?C++:什么是类接口?
【发布时间】:2011-07-07 03:48:18
【问题描述】:

我知道在 C++ 中没有 interface 关键字或其他关键字,但它更像是一种设计模式。

所以,如果我有一个 Apple 类,其中包含处理苹果的信息和方法(颜色、酸度、大小、吃、扔)..

  • Apple 的界面是什么样的?
  • 您通常需要哪些接口?

【问题讨论】:

  • Apple 是一个抽象类吗?也就是说,Apple 不能只有 Braeburn 或 Granny Smiths 吗?顺便说一下,你不能调用 throw() 方法,因为它是保留的,所以你必须解决那个问题。

标签: c++ design-patterns interface


【解决方案1】:

您只需在类中使用纯虚函数。

class IApple
{
    public:
      virtual ~IApple() {}  // Define a virtual de-structor

      virtual color     getColor()    = 0;
      virtual sourness  getSourness() = 0;
      virtual size      getSize()     = 0;
      virtual void      eat()         = 0;
};

【讨论】:

  • 如果你喜欢时尚的代码,你也可以拥有一个纯虚析构函数。并且不需要classstruct 就足够了,因为接口应该只有公共功能。
  • OP 还问为什么还要使用接口...What do you usually need interfaces for?
  • @Martin:有趣,我想你不喜欢 NVI 成语(非虚拟接口),它提倡将非虚拟公共方法委托给纯虚拟私有方法?
  • @Matthieu M:对新用户使用最简单的技术。但是,是的,我一直使用这种技术。但这取决于我们要达到的目标。
  • @CashCow:假设是为一个拥有多种苹果的苹果农户准备的。
【解决方案2】:

Martin 展示了一个界面。关于您的另一个问题-您通常需要它们做什么:

  • 它们可以被提供此 API 的函数用作基类
    • 接口可能只是派生类整体功能的一小部分;派生类可以实现很多接口
  • 接口的指针或引用(可能在容器中)可在代码中用于将该代码与任何特定实现分离(即,作为使用虚拟函数/分派的运行时多态代码的基础)
    • 这有助于减少编译时间并打破循环依赖关系
    • 实现可能由调用者或工厂方法提供
    • 能够改变实现通常会使系统整体更加灵活和可重用
    • 可以插入便于测试的实现
    • 接口本身可能具有作为使用文档形式的价值(有时我什至创建接口来说明预期的模板策略参数,尽管实际上不需要从中派生策略)
    • 某些设计模式通过在包含对象/代码的生命周期内更改实现来发挥作用
  • 它们可以用作类的一种注释或特征 - 即使不提供它们自己的任何实际行为 - 在决定适当的行为时,其他代码检查接口是否是基础

【讨论】:

    【解决方案3】:

    接口是一组成员,例如。在不同类之间共享的函数和变量,因此您可以访问接口的成员而不必首先知道它是哪个类,只要它实现了接口,您就可以确定它具有成员。

    例如,您可以使用它来遍历不同的对象,并在每个对象上调用相同的函数。

    【讨论】:

      猜你喜欢
      • 2010-11-04
      • 1970-01-01
      • 2011-07-05
      • 2021-11-02
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 2011-10-28
      相关资源
      最近更新 更多