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

StackOverflow https://stackoverflow.com/questions/2332655

Вопрос

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

Плюсы:

  • Пользователь Алгоритма не может видеть внутренний интерфейс

Минусы:

  • Пользователь должен использовать заводской метод для создания экземпляров
  • Я должен понизить алгоритм до AlgorithmPrivate, когда я хочу получить доступ к секретным параметрам изнутри библиотеки.

Я надеюсь, вы понимаете, чего я пытаюсь достичь, и я с нетерпением жду любых предложений.

Это было полезно?

Решение

Самый простой способ может заключаться в том, чтобы сделать setSecretParam() private и сделайте следующее: friend из Algorithm:

void setSecretParam(Algorithm& algorithm, double aParam)
{
  void setSecretParam(double aParam);
}

Другие советы

"Обычным подозреваемым" для замены наследования является Узор моста.Вы могли бы определить иерархию "Imps", производную от абстрактного класса AlgorithmImp, и предоставлять только соответствующие алгоритмы в заголовках библиотеки.Затем экземпляр алгоритма может быть создан как

ConcreteAlgorithm ca1(SomeParam, new LibraryUserAlgorithm());
ConcreteAlgorithm ca2(SomeParam, new InternalAlgorithm());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top