オブジェクト指向プログラミングにおける3つの重要概念

エンジニアとして仕事をしていく中で、「オブジェクト指向プログラミング」の概念は当たり前になっています。オブジェクト指向を理解しておくことがアプリ開発の現場や保守・運営といった業務にも役立ちます。この記事ではオブジェクト指向を支える基本概念を解説します。

  • カプセル化
  • 継承
  • ポリモーフィズム

上記の3つの概念がオブジェクト指向プログラミングを支え、その基本的な概念を理解しておくことが、プログラミング技術を向上させるヒントにもなります。

オブジェクト指向の概念

オブジェクト指向の概要は「カプセル化」「継承」「ポリモーフィズム」という概念ですが、それらの性質は「まとめる」や「分類する」といったものです。3つの概念を解説はしていきますが、重要となるのは「オブジェクト指向はまとめること」だという点です。技術的な部分も重要ですが、それ以上に「どうやって分かりやすくまとめるか」という点に気を配るようにしてください。

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

1.カプセル化(隠蔽)

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

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

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

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

2.継承

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

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

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

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

3.ポリモーフィズム

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

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

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

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

継承はあくまでも「オブジェクトの派生」を表す言葉ですが、ポリモーフィズムは「機能(オブジェクト)の所有」を表しています。最初はこの違いが分かりづらいものですが、少なくとも「こんなことがあったな」と覚えておくだけでも効果があると思います。