Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

【第5回】委譲

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/12/25 11:00

 第5回になる本連載も、今回で最終回となりました。最終回である今回は、「継承」と並びオブジェクト指向プログラミングで多用される「委譲(delegation)」という手法について解説していきたいと思います。

目次

オブジェクト指向の基本–委譲

委譲とは

 「委譲(delegation)」とは、メッセージに対する実際の振る舞いを別のオブジェクトに委ねることで別のオブジェクトの振る舞いを再利用する手法のことです。

図1:委譲の概念
図1:委譲の概念

 オブジェクト指向プログラミングでは、具体的には以下の方法で委譲を実現します。

  • 委譲を行うオブジェクトは、委譲先のオブジェクトへの参照を持つ
  • メッセージの応答を、参照を通じて委譲先のオブジェクトに委ねる

 このような手法を用いることによって、他のさまざまなオブジェクトから必要な機能をピックアップして再利用しつつ、独自の機能を持つ、新たなオブジェクトを作り出すことが可能になります。

継承との使い分け

 再利用の手法・仕組みとしては、もう1つ、前々回に解説した「継承」がありました。継承と委譲の違いとは、一体どのようなものでしょうか。

 復習すると、継承とは、既存のクラスの構造をベースに新しいクラスを定義する、クラス(つまりメッセージ/メソッド/属性全てをひっくるめた構造)を再利用する仕組みでした。これは、前回解説したような多態性を生みだすエンジンにもなっており、非常に強力な仕組みです。

 しかし、強力であるが故に、継承はそれ相応の副作用も持っています。

 たとえば、元のクラスを拡張して機能を追加したいという動機だけで継承を使っていった場合を考えます。継承階層の上位に位置するクラスの変更は、構造を共有する下位の全てのクラスに影響します。この場合、機能を追加するたびに、継承関係が横と縦に複雑化していってしまうため、上位に位置するクラスほど、その影響範囲が広がってしまい、修正のコストが高くなっていってしまいます(また、そういったクラスほど、ここぞという時に修正が必要な重要なコアなクラスだったりします)。

図2:機能追加だけに継承を利用していった例
図2:機能追加だけに継承を利用していった例

 上記のように、そのオブジェクトの持つ構造に関して知る/触れる必要が無く、機能のみを再利用したいといった場合に、委譲を使用します。

図3:継承と委譲の再利用の対象の違い
図3:継承と委譲の再利用の対象の違い

 それでは、委譲を実際にCで実現していきましょう。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 島田 浩二(Ruby札幌)(シマダ コウジ)

    1978年生まれ。電気通信大学電気通信学部情報工学科卒業後、メーカ系ソフトウェア会社にて携帯電話の開発業務に従事した後、2006年より札幌にてフリーのプログラマとして活動。2009年7月に株式会社えにしテックを設立し、同社代表取締役に就任。 日本Rubyの会理事、一般社団法人LOCAL理事、Ru...

バックナンバー

連載:Cでわかるオブジェクト指向
All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5