オブジェクト指向の基本–委譲
委譲とは
「委譲(delegation)」とは、メッセージに対する実際の振る舞いを別のオブジェクトに委ねることで別のオブジェクトの振る舞いを再利用する手法のことです。
![図1:委譲の概念](http://cz-cdn.shoeisha.jp/static/images/article/3710/01.gif)
継承との使い分け
再利用の手法・仕組みとしては、もう1つ、前々回に解説した﹁継承﹂がありました。継承と委譲の違いとは、一体どのようなものでしょうか。 復習すると、継承とは、既存のクラスの構造をベースに新しいクラスを定義する、クラス︵つまりメッセージ/メソッド/属性全てをひっくるめた構造︶を再利用する仕組みでした。これは、前回解説したような多態性を生みだすエンジンにもなっており、非常に強力な仕組みです。 しかし、強力であるが故に、継承はそれ相応の副作用も持っています。 たとえば、元のクラスを拡張して機能を追加したいという動機だけで継承を使っていった場合を考えます。継承階層の上位に位置するクラスの変更は、構造を共有する下位の全てのクラスに影響します。この場合、機能を追加するたびに、継承関係が横と縦に複雑化していってしまうため、上位に位置するクラスほど、その影響範囲が広がってしまい、修正のコストが高くなっていってしまいます︵また、そういったクラスほど、ここぞという時に修正が必要な重要なコアなクラスだったりします︶。![図2:機能追加だけに継承を利用していった例](http://cz-cdn.shoeisha.jp/static/images/article/3710/02.gif)
上記のように、そのオブジェクトの持つ構造に関して知る/触れる必要が無く、機能のみを再利用したいといった場合に、委譲を使用します。
![図3:継承と委譲の再利用の対象の違い](http://cz-cdn.shoeisha.jp/static/images/article/3710/03.gif)
それでは、委譲を実際にCで実現していきましょう。