オブジェクト指向プログラミングの三本柱と呼ばれるのが,継承,カプセル化,多態性(ポリモーフィズム)です。継承は既存のクラスの内容を引き継いで,新たな別のクラスを定義すること。カプセル化は,クラスのメンバーの中で,クラスを使う人に見せる必要のないものを隠すこと。多態性は,同じメッセージを与えたときに,それを受け取るオブジェクトによって異なる振る舞いをすることです。

 OOP言語は,非OOP言語が持っている機能(変数,関数,演算子,制御構造など)に,OOPを実現するための機能(クラス,継承,カプセル化,多態性など)を付加したものです。OOP言語をマスターするには,たっぷりと時間をかけて多くの機能を学習しなければなりません。ただし,せっかくOOP言語の学習をしたのに,思うようにプログラミングができないと嘆いている人もよくいます。多くの知識にほんろうされてしまい,どの機能を使えばよいのか迷ってしまうようです。

図1●クラスを土台としてOOPの三本柱がある
図1●クラスを土台としてOOPの三本柱がある

 皆さんがOOPの大量の知識に惑わされないように,まず,OOPに必須の機能と,補足的な機能を明らかにしておきましょう。「これだけは絶対にやらなければダメ」という必須の機能は,クラスを作り,クラスのメンバー(関数と変数)を使うことです。これは,非OOP言語のプログラミング・スタイルに,変数と関数をクラスでグループ化するという概念が加わっただけです。簡単なことですから,だれでも理解でき,実践できるでしょう。どうぞ安心してください。

 これに対して,“OOPの三本柱”はちょっと難しくなります。しかし実は,「必要なら使ってください。別に使わなくても構いませんよ」という程度の補足的な機能なのです。OOP言語の様々な機能の関係は,クラスを土台として,その上に継承,カプセル化,多態性(ポリモーフィズム)が柱のように立っているようなイメージになります。だから,継承,カプセル化,多態性のことを「OOPの三本柱」と呼ぶのです。OOPの三本柱は,どれもクラスを対象とした機能です(図1)。

OOPの三本柱を適切に活用するポイント

 OOPのメリットは「クラスを再利用できるのでプログラミングが効率化すること」と,「クラス単位で改造や修正を行えるので保守性が向上すること」の二つです。プログラミングにおいてOOPの三本柱を活用する目的も,もちろん効率化と保守性の向上です。

 ただし,不適切な場面でOOPの三本柱を使うと逆効果になってしまう場合があります…。あれあれ,こんな風に説明すると,OOPの三本柱を使うのが怖くなってしまいますね。そこで皆さんに,OOPの三本柱を適切に活用するための,とっておきのポイントをお教えしましょう。それは技術的なことではありません。OOPを実践するときの心構えは,「思いやり」を持つことです。思いやり!思いやり!思いやり! と何度も強調したいほど重要なポイントです。

 OOPは,大規模なプログラムに適したプログラミング・スタイルです。大規模なプログラムは,複数のプログラマから編成されたチームによって開発されます。チームの中では「私はクラスを作る人,あなたはクラスを使う人」という役割分担ができてきます。皆さんは,クラスを作る人になったとしましょう。どんなクラスを作りますか? 必要な機能を満たしたクラスを作る――もちろん正解です。ただし,それだけではプロの仕事として十分ではありません。使いやすいクラスを作ることを心掛けるべきです。すなわち,クラスを使う人への思いやりを込めたクラスを作るのです。

 OOPの三本柱である継承,カプセル化,多態性は,どれもクラスを使いやすくするための機能と言えます。ただし,これらの機能を技術的に理解しただけでは,適切な場面で効果的に活用することはできません。思いやりという観点から個々の機能を理解すれば,自然に使いこなせるようになります(図2)。

図2●OOPの三本柱を活用するポイントは“思いやり”
図2●OOPの三本柱を活用するポイントは“思いやり”

 思いやりを込めたクラスを作るためには,クラスの使われ方を知らなければなりません。クラスの使われ方には,(1)クラスのメンバーを使う,(2)クラス全体を継承して使う,(3)別のクラスのメンバーとして使う,があります。皆さんが作るクラスは,同じチームのほかのプログラマ(おそらく皆さんの先輩でしょう)に使われるはずです。プログラミングを始める前に,チーム内でよく相談して,皆さんが担当するクラスがどのような使われ方をするかを確認してください。そのうえで,使いやすいクラスを作るのです。

 クラスの3種類の使われ方を示すサンプルをお見せしましょう(このプログラムの内容に意味はありません)。リスト1は,Javaで記述したアプレットの一部です。アプレットとは,Webブラウザ上で動作するプログラムのことです。このプログラムは,全体がMyClassというクラスになっています。MyClass extends Appletの部分は,Appletクラス全体を継承したMyClassクラスを定義することを意味しています。これがクラスの使われ方の(2)です。継承の意味に関しては,すぐ後で説明します。

リスト1●クラスの使われ方は3種類ある
リスト1●クラスの使われ方は3種類ある

 MyClassクラスのメンバー(「{」と「}」の中に記述された変数と関数)として,btという名前の変数(フィールド)と,initおよびpaintという名前の関数(メソッド)があります。btのデータ型は,ボタンの機能を提供するButtonクラスです。MyClassのメンバーにButtonクラス全体を含めているわけです。これがクラスの使われ方の(3)です。

 paintメソッドに記述した処理内容は,GraphicsクラスのメンバーであるdrawStringメソッドを使って「日経ソフトウエア」という文字列を表示することです。これがクラスの使われ方の(1)です。プログラムの内容を細かく理解する必要はありません。雰囲気を感じていただければOKです。