SHOEISHA iD

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

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

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

【第4回】多態性


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

 それでは前回に引き続き、C言語によるOOPを通して、オブジェクト指向の基本的な概念について解説していきたいと思います。今回は、「カプセル化」や「継承」と共にオブジェクト指向における重要な要素として挙げられることの多い、「多態性(Polymorphism)」について解説していきたいと思います。

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

オブジェクト指向の基本 - 多態性

多態性とは

 急に用語が難しくなりますが、皆さんは「多態性(Polymorphism)」という用語をご存知でしょうか。 多態性と訳さずに、「多相性」「多型性」などと訳されたり、そのまま「ポリモーフィズム」「ポリモフィズム」または「ポリモルフィズム」といった名称で解説されていることも多いので、そちらの名称で記憶されている方もいらっしゃるかもしれません。

 「多態性(Polymorphism)」とは、オブジェクト指向における「実行される処理の実体が、コールされたメッセージではなく、メッセージを受けたオブジェクトによって決定される性質」のことです。また、この性質を使って「同一のメッセージを使って、オブジェクトごとに異なった処理を行わせること」を指して、「多態性」という言葉が使われる場合もあります。

 OOPでは、さまざまな場面で、この性質を活かしたコーディングを行うことになります。これは、多態性を活かしたコーディングを行うことで、変更に強く柔軟なコードを実現することが出来るためです。それでは、多態性を利用するメリットについて見て行きましょう。

多態性を利用したコーディング

 まずは、Cで書かれた以下のコード例をご覧下さい。

リスト1:コード例(その1)
switch (user.category_id) {
case USER_CATEGORY_ID_GUEST:
    Guest_action(user);
    break;
case USER_CATEGORY_ID_MEMBER:
    Member_action(user);
    break; 
default:
    return -1;
}

 上記は、利用者(user)の分類(category_id)ごとに振る舞いを分けるような処理をイメージしたコードになっています。Cでコードを書かれている方であれば、シーンは違えど、これと似たようなコードを書いたことが、一度はあるのではないでしょうか。

 次に同様のシーンを、多態性を利用して書いた場合の例をご覧ください。

リスト2:コード例(その2)
user->action(user);

 嘘みたいですが、多態性を利用すると、上記のようなシーンはたった1行で済んでしまいます。少し種明かしをしましょう。前述の通り、多態性を取り入れた場合、実行される処理の実体は、コールされたメッセージではなく、メッセージを受けたオブジェクトによって決定されることになります。上記の場合だと、具体的に何の処理が行われるかは、変数userに何のオブジェクトが格納されているかによって、決定されることになります。

図1:多態性を用いたコード例の処理イメージ
図1 多態性を用いたコード例の処理イメージ

 なので、利用者の分類ごとに、actionというメッセージに応答出来るオブジェクトを生成し、それをuserに格納しておけば、あとは格納されたオブジェクトに従って適切な振る舞いが実行される、ということになります。いかがでしょうか、多態性を活かしたコーディングについてイメージが出来てきたでしょうか。

 最初に挙げたようなコード例は、Cで書かれたプログラムでとてもよく見かけるものです。しかし、このようなコードは、分類の増減のたびにコードに修正を入れる必要があります。また、それが一カ所に納まらない場合は、さまざまな場所に分岐による判断が発生することになり、それらをずっとメンテナンスしていかなければならなくなってしまいます。このような問題に悩まされたことのある方であれば、多態性を活かしたコーディングのメリットについて、理解してもらえるのではないかと思います。

多態性の実現

 一般に、多態性を実現するには、継承の仕組みを利用する方法と、オブジェクト間で共有する一連のメッセージを規定する独自の機構を用意・利用する方法の、2つがとられます。継承の仕組みを利用する方法では、スーパークラスで定義されたメッセージの処理の実体を、各サブクラスで用意することで、多態性を実現します。 独自の機構を用意・利用する方法では、独自の機構を用いて規定されたメッセージの処理の実体を、統一的に扱いたい複数のクラスで用意することで、 多態性を実現します。

図2:多態性の実現
図2 多態性の実現

 それでは、多態性をCで実現していきましょう。今回は、前回実装した継承の仕組みを利用して多態性を実現していこうと思います。

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

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

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

メールバックナンバー

次のページ
Cによる多態性の実現

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング