こんにちは、uni-browserの財前航介です。
こちらのブログでは、
「プログラムを書くことなく、オブジェクト指向について説明する!」
という壮大な目標の下、いくつかの記事を書いて参りました。
【初心者向け】オブジェクト指向とは >>
【オブジェクト指向の基本】クラス(class)とは >>
オブジェクト指向における「インスタンス」とは? >>
今回のテーマは、「ポリモーフィズム」というものです。
発音しにくいですね。
「ポリモーフィズム」です。
(噛まないでくださいね)
「ポリモーフィズム」はすごく概念的な話で、初心者の方にはイメージしづらいかもしれないので、「クラス」や「インスタンス」などの基本的な概念がまだあまりよく分っていない方は、先に上記の記事をご参照頂ければと思います。
この記事では、なんとなく「ポリモーフィズム」がどういったものなのかを理解して頂き、実際のプログラムで出会ったときに、「なるほど!」と思ってもらえるように説明していけたらと思います。
ポリモーフィズムとは

「ポリモーフィズム」は、「ポリモルフィズム」なんて呼ばれることもあります。
(どちらにしても覚えづらいですね)
これは日本語にすると、「多態性」というものです。
(日本語にしても何やらよく分らんですね)
一言で平たく言うと、
「同じ動作でも、ものによって動き方が変わるよ」
ってことです。
ここで言う「動作」とは、「メソッド」のことです。
(よく覚えていない方は、「フィールドとメソッド」をご参照ください。)
ここで言う「もの」とは、「オブジェクト」のことです。
つまり、上記の説明は、
「同じメソッドでも、オブジェクトによって動き方が変わるよ」
と、言い換えることができます。
たとえば、以下のような3つのオブジェクト(クラス)を考えてみましょう。
- 飛行機
- ヘリコプター
- ダンボ
この3つのクラスは、同じ動作(メソッド)を行うことができます。
それは、「空を飛ぶ」ということです。
ただ、同じ「空を飛ぶ」というメソッドでも、それを実現する方法は、それぞれのクラスによって異なります。
飛行機は、ジェットエンジンで空を飛びますね。
ヘリコプターはプロペラをくるくるして空を飛びます。
ダンボは、耳をパタパタして空を飛びます。
このように、「同じ動作(メソッド)でも、そのオブジェクトの種類によって、実際にやっていることが変わる」というのが、「ポリモーフィズム(多態性)」というものです。
なんだか、当たり前のことを言っていますね。
これの何がそんなにすごいのでしょうか?
インターフェースとポリモーフィズム

以前の記事で、「オブジェクト指向は、プログラミングの部品を作るための考え方だ」ということを申しました。
「オブジェクト」とは、「もの」にたとえて作られた、プログラムの部品です。
「部品」や「道具」は、「使いやすい」ことがとても大事です。
たとえば以下の3つ
- 飛行機
- ヘリコプター
- ダンボ
飛行機の飛ばし方を知っているパイロットが、ヘリコプターの操縦ができるとは限りません。
ヘリコプターのパイロットが、ダンボに乗ってうまく飛べるかは分かりません。
それではなんだか不便です。
どうせ同じ「空飛ぶ乗り物」なら、同じように飛ばせた方が、便利なはずです。
その為に、「空を飛べ!」という命令を、あらかじめ決めておくのです。
「空を飛べ!」と言ったら飛行機も飛んでくれるし、ヘリコプターも、ダンボも、同じように飛ばせる。
すごく使いやすくて、便利ですね。
ただ、もし同じ「空を飛べ!」という命令で、3つとも飛んでくれるのであれば、その道具を使う利用者は、その「空飛ぶ乗り物」が、「飛行機」なのか、「ヘリコプター」なのか、「ダンボ」なのかを知る必要はありません。
だって、「空を飛べ!」と言ったら、みんな同じように飛んでくれるのですから、別にどれに乗っても一緒です。
ジェットエンジンで飛んでいようが、プロペラで飛んでいようが、耳をパタパタだろうが、利用者からしたら、飛んでくれればそれで良いのです。
実は、これが「ポリモーフィズム」のすごいところです。
利用者は、別に中身を知らなくても、いろいろなオブジェクトに、同じように命令を行うことができるのです。
そして、同じような結果を得ることができてしまいます。
「ポリモーフィズム」と関わりがある言葉の一つに、「インターフェース」というものがあります。
先ほどの例で言えば「空飛ぶ乗り物」というのが、「インターフェース」に当たります。
interfaceとは日本語にすると、「境界」という意味ですね。
何の境界なのかと言えば、プログラムと利用者との「境界」です。
なぜならば、「飛行機」「ヘリコプター」「ダンボ」など、いろいろな「空飛ぶ乗り物」が世の中にはありますが、利用者はそれらの詳細を知る必要はないのです。
ただ、「空飛ぶ乗り物に対して空を飛べ!と命令をすれば、空を飛ぶ」ということだけ知っていれば良いのです。
つまりこの、「空飛ぶ乗り物」というのが、その部品たちの利用者が知っている部分。
利用者との「境界」なのです。
(別の概念に「継承」というものがありますが、簡単のためにここでは省略しましょう。)
実際のプログラムでは?

「空飛ぶ乗り物」の件は分かったとして、
これは実際のプログラムではどのように使われるのでしょうか。
ここでは例として、プログラムからデータベースに接続する例を考えましょう。
通常、プログラムからデータベースに接続するときには、あらかじめ用意されているプログラムの「部品」を使います。
つまり、オブジェクトですね。
ただ、一口に「プログラムからデータベースに接続する」と言っても、いろいろな種類のデータベースがあります。
有名なものでは、Oracleとか、SQL Serverとか、Mysqlとかとか…
プログラムからデータベースに接続する時の仕様も、それぞれのデータベースの種類によって異なるはずです。
つまり実際には、データベースの種類によって、異なるプログラムが書かれているはずなんですね。
なんだかさっきの「空飛ぶ乗り物」の例に似ていますね。
ここで、インターフェースの登場です。
データベース接続用の部品には、「データベースに繋がれ!」という命令を下すと、データベースに接続できる…
という、「インターフェース」の情報だけ知っていれば、その部品の利用者は、そのオブジェクトが「Oracle接続オブジェクト」なのか、「SQL Server接続オブジェクト」なのか、気にしなくてよくなるわけです。
中身はいろんな実装の仕方があるけど、みんな同じように動作(メソッド)を呼び出せる。
その時にオブジェクトの細かい種類は知らなくて良い。
というのが、ポリモーフィズムという考え方の、利点です。
こういう理念に従って、「オブジェクト指向」のプログラミング言語は設計されているんですね。
まとめ

今日はかなり概念的な、ふわふわした話でしたね。
「何だか、分かったような、分からないような…」
という感じかもしれません。
ただ、この概念を何となくわかった上で実際のプログラミングをしてみると、理解が深まるのではないかと思います。
実際のシステム開発の現場では、「オブジェクト指向」のことなどよく分らなくても、実はある程度プログラムが書けてしまいます。
「オブジェクト指向」の代表格のJavaだって、別に「オブジェクト指向」を無視して、単純にプログラムの記述を並べることだってできます。
ただ、それはJavaを設計した人たちの意図するところではありません。
せっかく便利に、人間にも理解しやすい形でプログラミングができる仕組みを用意してくれてあるのですから、ぜひともその利点を享受したいものです。
また、詳しくプログラムについて調べていくと、必ずどこかで「オブジェクト指向」が分からないと、理解できない領域にぶつかります。
そんな時、なんとなくこの記事で学んだ「ポリモーフィズム」や「インターフェース」のことを覚えておくと、「あ~、Java作った人は、こんなこと考えて作ってたんだな~」なんて、理解が深まるかもしれません。
この記事が、皆様の学習に少しでもお役に立てば幸いです。
最後まで読んで下さり、ありがとうございました。
コメント