为类/信息隐藏创建内部和外部接口

时间:2010-02-25 08:40:27

标签: c++ interface information-hiding

对于静态C ++库的某些类,我想为库的用户和库本身提供不同的接口。

一个例子:

class Algorithm {

  public:

    // method for the user of the library
    void compute(const Data& data, Result& result) const;


    // method that I use only from other classes of the library
    // that I would like to hide from the external interface
    void setSecretParam(double aParam);

  private:

    double m_Param;
}

我的第一次尝试是将外部界面创建为ABC:

class Algorithm {

  public:

    // factory method that creates instances of AlgorithmPrivate
    static Algorithm* create();

    virtual void compute(const Data& data, Result& result) const = 0;
}

class AlgorithmPrivate : public Algorithm {

  public:

    void compute(const Data& data, Result& result) const;

    void setSecretParam(double aParam);

  private:

    double m_Param;
}

优点:

  • Algorithm的用户无法看到内部接口

缺点:

  • 用户必须使用工厂方法创建实例
  • 当我想从库内部访问秘密参数时,我必须将算法转换为AlgorithmPrivate。

我希望你理解我想要达到的目标,我期待着任何建议。

2 个答案:

答案 0 :(得分:3)

最简单的方法可能是setSecretParam() private并将friend Algorithm作为void setSecretParam(Algorithm& algorithm, double aParam) { void setSecretParam(double aParam); }

{{1}}

答案 1 :(得分:1)

替换继承的“通常嫌疑人”是Bridge pattern。您可以定义从抽象类AlgorithmImp派生的“Imps”层次结构,并且只在库头中公开适当的算法。然后可以创建算法实例

ConcreteAlgorithm ca1(SomeParam, new LibraryUserAlgorithm());
ConcreteAlgorithm ca2(SomeParam, new InternalAlgorithm());