SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Cでわかるオブジェクト指向

【第5回】委譲


  • X ポスト
  • このエントリーをはてなブックマークに追加

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

委譲とは

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

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

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

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

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

継承との使い分け

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

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

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

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

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

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

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

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

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Cによる委譲の実現(1)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Cでわかるオブジェクト指向連載記事一覧

もっと読む

この記事の著者

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3710 2009/03/17 13:14

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング