0

私はC++でプログラミングしていますが、これは設計に関する一般的な質問です。

1対1の関連付け関係にあるオブジェクトがある場合、それらの間に多くの一般的なメソッドが存在する傾向があり、本質的に内部クラスのメソッドを直接呼び出す定型コードにつながることに気付きました。

Tab例として、タブとそれに対応するウィジェットを表すというクラスがあります。Tabbableオブジェクトが継承できるというクラスもあるので、タブで表示できます。その後、 ATabはこのTabbableオブジェクトを取得し、それ自体を正しくレンダリングできます。これらのクラスには両方とも、たとえばタイトルやアイコンに関連する多くの類似したメソッドがあります。

class ITabbable {
    public:
    ITabbable();
    virtual ~ITabbable();

    virtual string getTitle() = 0;
    virtual widget getContentWidget() = 0;


    // etc...
}


class Tab {
    public:
    Tab(ITabbable* tabbableObject);


    // lots of boilerplate code:
    string getTitle() {
        return m_tabbableObject->getTitle();
    }

    widget getContentWidget() {
        return m_tabbableObject->getContentWidget();
    }

    // etc...

    private:
    ITabbable* m_tabbableObject; // association relationship
}

多くのコードが重複していて、不要のようです。を入れることができないため、継承はここでは確実に機能しませTabTab

これは私たちが対処しなければならないことですか?または、これらの状況を回避する方法はありますか?

4

1 に答える 1

1

上手。この特定の状況に。単純に実装してみませんTab::getTabbable()か?

このような:

const ITabbable* Tab::getTabbable() const { return m_tabbableObject; }

次に、ユーザーは次のことができます。

const ITabbable* obj = tab->getTabbable();
string title = obj->getTitle();

すべての機能を複製する必要はありません。


更新:このリファクタリングは通常、RemoveMiddleManと呼ばれます

于 2011-03-06T18:50:33.707 に答える