إنشاء واجهات داخلية وخارجية لفئة / معلومات مختبئة

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;
}

الايجابيات:

  • لا يمكن لمستخدم الخوارزمية رؤية الواجهة الداخلية

سلبيات:

  • يتعين على المستخدم استخدام طريقة المصنع لإنشاء مثيلات
  • لا بد لي من الخروج من الخوارزمية إلى الخوارزمية عندما أرغب في الوصول إلى المعلمات السرية من داخل المكتبة.

أتمنى أن تفهم ما أحاول تحقيقه وأنا أتطلع إلى أي اقتراحات.

هل كانت مفيدة؟

المحلول

قد تكون أبسط طريقة لجعلها setSecretParam() private وجعل ما يلي أ friend من Algorithm:

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

نصائح أخرى

"المشتبه به المعتاد" ليحل محل الميراث نمط الجسر. يمكنك تحديد التسلسل الهرمي لـ "IMPs" المستمدة من خوارزميات الطبقة المجردة وفك الخوارزميات المناسبة فقط في رؤوس المكتبة. ثم يمكن إنشاء مثيل الخوارزمية كـ

ConcreteAlgorithm ca1(SomeParam, new LibraryUserAlgorithm());
ConcreteAlgorithm ca2(SomeParam, new InternalAlgorithm());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top