Создание внутренних и внешних интерфейсов для класса / скрытие информации
-
22-09-2019 - |
Вопрос
Для некоторых классов статической библиотеки 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());