ホームに戻る
出典 :
委譲 - Wikipedia 継承と委譲の使い分けと、インターフェースの重要性について
関連 :
インタフェース SOLIDの原則 ソフトウェア開発におけるアンチパターン [C++]継承 (Inheritance)
目次 :

委譲 (delegation) とは

オブジェクト指向プログラミングにおいて、あるオブジェクトに対する操作の一部を他のオブジェクトに代替させる手法のこと。
委譲する側のオブジェクトが、委譲される側のオブジェクトの機能を呼び出す(利用する)ことを表す。
尚、「移譲」は誤り。

継承と委譲の使い分け

あるオブジェクトが別のオブジェクトの機能を用いる場合、両者の関係により、継承でその機能を獲得するか、委譲でその機能を利用するかの選択が必要となる。

継承を用いる場合

// 「乗り物」クラス class Vehicle { public: // 加速 virtual void Accelarate() = 0; }; // 「自動車」クラス : Vehicle を継承 class Car : public Vehicle { public: // 加速 virtual void Accelarate(); }; // 「自動二輪車」クラス : Vehicle を継承 class MotorCycle : public Vehicle { public: // 加速 virtual void Accelarate(); };
この例では、「自動車」・「自動二輪車」が「乗り物」を継承している。
これは、「自動車」・「自動二輪車」が「乗り物」の範疇に含まれる "is-a" の関係にあることによる。
(Car is a Vehicle. 「自動車は乗り物(の具体例)である」)
即ち「自動車」は「乗り物」としての特性を有している必要があるため、「乗り物」を継承することでその特性を獲得する

委譲を用いる場合

// 「エンジン」クラス class Engine { : }; // 「車輪」クラス class Wheel { : }; // 「自動車」クラス : Engine 、Wheel を所持 class Car { private: Engine mEngine; //< エンジン Wheel mWheel; //< 車輪 public: // 加速 void Accelarate(); }; // 加速 void Car::Accelarate() { mEngine.DoSomething(); mWheel.DoSomething(); }
この例では、「自動車」が「エンジン」・「車輪」を所持している。
Car クラスのインスタンスが Accelarate() をコールされた際に、mEngine 、mWheel の機能を用いることで目的を達成しようとする。
即ち、Car は Engine 、Wheel に処理を「委譲」する
これは、「エンジン」・「車輪」が「自動車」の部品として振舞う "part-of" の関係にあることによる。
(Engine is a part of a Car. 「エンジンは自動車の一部(部品)である」)
「自動車」は「エンジン」「車輪」を部品として有していればよく、これらの特性を自身が獲得する必要は無い
また、委譲する側(Car)が委譲される側(Engine)の「実体」を保有している必要は無く、参照などのアクセス手段を有していればよい。