-2

インターフェイスを実装するクラスがライブラリからのみ呼び出せるようにする設計を実現しようとしています。つまり、実装されたインターフェイスへのアクセスは、ライブラリ(TopLib)を介して行う必要があります。デリゲートを使用する必要がある場合のようです。デザインについてどう思いますか?これは機能しますが、より良く、堅牢で、ばかげた証拠にするためのフィードバックと提案をいただければ幸いです。

class Interface 
{
protected:
    virtual void hi(void) = 0;
};

class ABC : private Interface {
protected:
    ABC() {}
    virtual void hi() {
        std::cout << "abc" << std::endl;
    }
};

class XYZ : private Interface {
protected:
    XYZ() {}
    virtual void hi() {
        std::cout << "xyz" << std::endl;
    }
};

template<typename T>
class TopLib : private T
{
public:
    void sayhi() {
        hi();
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    TopLib<ABC> b;
    b.sayhi();

    TopLib<XYZ> c;
    c.sayhi();
    //c.hi(); <- fails

    //ABC test; <- fails
    //test.hi(); <- fails

    getchar();
    return 0;
}
4

1 に答える 1

1

アクセス修飾子は派生クラスで緩和できるため、インターフェイスを実装する人に任せることができます。私が言うのを止めるものは何もない

class FooBarBaz : private Interface {
  public:
    FooBarBaz() {}
    virtual void hi() { // Implements Interface::hi()
        std::cout << "see what i mean!" << std::endl;
    }
};

ありまたはなしで使用しTopLib<FooBarBaz>ます。

于 2013-01-29T20:11:26.437 に答える