Создание внутренних и внешних интерфейсов для сокрытия класса / информации - PullRequest
3 голосов
/ 25 февраля 2010

Для некоторых классов статической библиотеки 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 ]

3 голосов
/ 25 февраля 2010

Самый простой способ - сделать setSecretParam() private и сделать следующее friend из Algorithm:

void setSecretParam(Algorithm& algorithm, double aParam)
{
  void setSecretParam(double aParam);
}
1 голос
/ 25 февраля 2010

"Обычный подозреваемый" для замены наследования - Шаблон моста .Вы можете определить иерархию «Бесов», полученных из абстрактного класса AlgorithmImp, и предоставлять только соответствующие алгоритмы в заголовках библиотеки.Тогда экземпляр алгоритма может быть создан как

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