オブジェクト指向の3つの概念

現在のアプリケーション開発の現場では当たり前の開発手法となっています。つまりオブジェクト指向を理解して使いこなせるかどうか、それがエンジニアとして働けるかどうかの分岐点となるのかもしれません。

オブジェクト指向を支えているのが「カプセル化」「継承」「ポリモーフィズム」という3つの概念になります。この概念をうっすらでも良いので理解しておくことが重要です。ここでは、その3つの概念について解説していきます。

オブジェクト指向の中心

オブジェクト指向の概要は「オブジェクト指向の概要」にて解説しています。その記事内でも「まとめる」という言葉が頻繁に出てきているかと思います。「カプセル化」「継承」「ポリモーフィズム」という概念はオブジェクト指向の中心となるものですが、それらの性質は「まとめる」や「分類する」といったものです。

3つの概念を解説はしていきますが、重要となるのは「オブジェクト指向はまとめること」だという点を忘れないことです。技術的な部分も重要ですが、それ以上に「どうやって分かりやすくまとめるか」という点に気を配るようにしてください。

オブジェクト指向の技術的な部分は「分かりやすくまとめること」をサポートするための方法論・手段であり、それがすべてではありません。ということでオブジェクト指向における重要な3つの概念について解説していきます。

1.カプセル化(隠蔽)

オブジェクト指向の中で最も重要だと言えるのが「カプセル化」です。「隠蔽」とも言われています。カプセル化における重要な点は「隠す」という点にあります。よりプログラミング言語的な言い方をすると「見せなくてもよい処理は見せない」ということになるでしょうか。

C#ではクラスを上手く使って不必要に処理を外側に見せないようにすることです。また処理だけでなく「属性」も見せないようにします。カプセル化を例えるならば「リモコン」に近いものと言えるかもしれません。リモコンはボタンを押すだけで行いたい作業ができますよね。テレビの電源を付けたり、チャンネルを変えたり。

使う側からみるとリモコンは「ボタン」のみで操作ができる便利なモノです。使う人は「リモコンがどのように出来ているか」や「リモコンがどのように作られるか」は気にする必要はありません。ボタンを押して行いたい操作をするだけです。

カプセル化はこの考え方に近いです。よりC#の言葉で表現をすると「クラスとアクセス修飾子を上手く使って、メソッドやプロパティを外側から使えるように整備をして、不要な部分は外側から操作できないように隠してしまう」という感じでしょうか。「機能として提供するのに何もかも見せる必要はない」ということです。

2.継承

オブジェクト指向で重要となる概念に「継承」というモノがあります。継承とは「共通する部分」を「基底」として定義しておいて、共通部分が必要となる機能に受け継がせる機能を指します。以前に投稿した「」という記事では「車」と「バス」で例えています。

「車」は走る・止まる・右に曲がる・左に曲がるといった基本機能を備えており、それを基礎的な部分として「バス」という派生形を作ることができます。バスは車の基本的な動作に加えて、アナウンスをする・お金を徴収する・ドアの開閉を操作するといった、一般的な車にない特性を備えていますよね。

このように、基底となる部分を膨らませて「派生」として機能を作成できるのが継承の役割です。オブジェクト指向では「まとめる」という「分類」も重要となっており、その一つの概念として登場するのが「継承」になります。

しかしながら「継承」を使いすぎると、ソースコードが読みづらくなるといったデメリットがあるので注意が必要です。近年では継承でオブジェクトを表すよりも、次に紹介するポリモーフィズムでオブジェクトを表す方が多くなっている気がします。

3.ポリモーフィズム

ポリモーフィズムは「多相性」という意味を持っています。多相性とは「ある関数や型を複数の型に対して使用できる」という性質を示す言葉になります。よりプログラミングに近い書き方でいうと「特定の動作の要求に対して、オブジェクトごとに異なる処理をする」ということです。

よく具体例にあげられるのが「動物には鳴くという行為(処理)があるが、鳴くとっても人や犬、猫、カラスなど種類によって異なる鳴き声が異なる」というものです。ここから分かるように特定のオブジェクトに対して「処理は定義されているが、処理内容はそれぞれによって異なる」というのがポリモーフィズムです。

これまでに触れてきた「カプセル化」や「継承」はクラスに関連する考え方であり、それらは「まとめる」という分類に関連するものでした。それに対してポリモーフィズムは「持っている」という関係です。あるオブジェクトは「特定の機能・物体を持っている」という「関連」「所有」を示す言葉です。

この機能を満たすためにC#では「インターフェース」や「抽象クラス」を使用することがあります。技術的な点については今後取り組んでいくことになりますが、覚えておいて欲しいのは「特定のクラスに対して”継承”は1つのクラスしかできないが、ポリモーフィズムは複数設定することができる」ということです。

継承はあくまでも「オブジェクトの派生」を表す言葉ですが、ポリモーフィズムは「機能(オブジェクト)の所有」を表しています。最初はこの違いが分かりづらいものですが、この連載を通して徐々に理解して頂けるかと思います。