読者です 読者をやめる 読者になる 読者になる

【C++】委譲(delegation)ってなに?

基本概念

委譲を行うオブジェクトは委譲先オブジェクトへの参照を持ち、必要に応じてその参照を切り替える事で動作にバリエーションを持たせる事ができる。
一種の実装遅延、プラグイン機構である。
一例としては、オブジェクトの編集を行う時、編集の前処理、後処理を本処理と独立させ委譲先に任せる事で、オブジェクト本体の変更を最小限にとどめ局所性を向上させる、などがある。
(中略)
委譲を引き受けるオブジェクトはどのような操作を実装しなければならないか知っている必要があるため、インタフェースと併用される場合が多い。

#include <iostream>

struct ExampleInterface
{
        virtual void Function() = 0;
};

class Something
{
    public:
        void Print()
        {
            std::cout << "Something::Print() is called." << std::endl;
        }
};

class SomethingDelegator:public ExampleInterface
{
        Something *something;
    public:
        SomethingDelegator( Something *something ):something( something )
        {
        }

        void Function()
        {
            // SomethingDelegatorに対するFunction関数の呼び出しをSomethingのPrint関数に委譲している
            something->Print();
        }
};

int main()
{
        Something source;
        SomethingDelegator delegate( &source );

        // SomethingDelegatorがSomethingに委譲した事によりSomethingのPrint関数が呼ばれる
        ExampleInterface &example = delegate;
        example.Function();

        return 0;
}

https://ja.wikipedia.org/wiki/%E5%A7%94%E8%AD%B2

メリットとデメリット

メリット

スーパークラスの実装が変更された場合に、委譲なら別クラスを使用するなどの対応ができる.

デメリット

デメリットとしては、継承に比べてコードの記述量が多くなる.
継承は何も書かなければスーパークラスの機能が使えるが、委譲の場合はメソッドの呼び出しを実装しなくてはなりません。