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.

È stato utile?

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());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top