La creazione di interfacce interne ed esterne per una classe / informazioni nascondere
-
22-09-2019 - |
Domanda
Per alcune classi di una libreria statica C ++ voglio offrire diverse interfacce per l'utente della biblioteca e per la libreria stessa.
Un esempio:
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;
}
Il mio primo tentativo è stato quello di creare l'interfaccia esterna come 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;
}
Pro:
- L'utente di algoritmo non può vedere l'interfaccia interna
Contro:
- L'utente deve utilizzare un metodo factory per creare istanze
- devo downcast Algoritmo per AlgorithmPrivate quando voglio accedere ai parametri segreto dall'interno della biblioteca.
Spero che tu capisca quello che cerco di raggiungere e non vedo l'ora a qualsiasi suggerimento.
Soluzione
Il modo più semplice potrebbe essere quello di rendere setSecretParam()
private
e fare il seguito di un friend
di Algorithm
:
void setSecretParam(Algorithm& algorithm, double aParam)
{
void setSecretParam(double aParam);
}
Altri suggerimenti
Il "solito sospetto" per sostituire l'ereditarietà è Ponte modello . Si potrebbe definire una gerarchia di "folletti" derivate dalla classe astratta AlgorithmImp ed esporre solo algoritmi appropriati nelle intestazioni di libreria. Poi un esempio di algoritmo può essere creato come
ConcreteAlgorithm ca1(SomeParam, new LibraryUserAlgorithm());
ConcreteAlgorithm ca2(SomeParam, new InternalAlgorithm());