オブジェクト指向の基本–委譲
委譲とは
「委譲(delegation)」とは、メッセージに対する実際の振る舞いを別のオブジェクトに委ねることで別のオブジェクトの振る舞いを再利用する手法のことです。
オブジェクト指向プログラミングでは、具体的には以下の方法で委譲を実現します。
- 委譲を行うオブジェクトは、委譲先のオブジェクトへの参照を持つ
- メッセージの応答を、参照を通じて委譲先のオブジェクトに委ねる
このような手法を用いることによって、他のさまざまなオブジェクトから必要な機能をピックアップして再利用しつつ、独自の機能を持つ、新たなオブジェクトを作り出すことが可能になります。
継承との使い分け
再利用の手法・仕組みとしては、もう1つ、前々回に解説した「継承」がありました。継承と委譲の違いとは、一体どのようなものでしょうか。
復習すると、継承とは、既存のクラスの構造をベースに新しいクラスを定義する、クラス(つまりメッセージ/メソッド/属性全てをひっくるめた構造)を再利用する仕組みでした。これは、前回解説したような多態性を生みだすエンジンにもなっており、非常に強力な仕組みです。
しかし、強力であるが故に、継承はそれ相応の副作用も持っています。
たとえば、元のクラスを拡張して機能を追加したいという動機だけで継承を使っていった場合を考えます。継承階層の上位に位置するクラスの変更は、構造を共有する下位の全てのクラスに影響します。この場合、機能を追加するたびに、継承関係が横と縦に複雑化していってしまうため、上位に位置するクラスほど、その影響範囲が広がってしまい、修正のコストが高くなっていってしまいます(また、そういったクラスほど、ここぞという時に修正が必要な重要なコアなクラスだったりします)。
上記のように、そのオブジェクトの持つ構造に関して知る/触れる必要が無く、機能のみを再利用したいといった場合に、委譲を使用します。
それでは、委譲を実際にCで実現していきましょう。