6章 オブジェクト指向とは | |
1.オブジェクト指向とクラス | |
「オブジェクト指向」では、処理は二の次である。一番に考えるのはオブジェクトである。オブジェクトというのは「モノ」であり、実際に存在するもののことをいう。クラスとオブジェクトは等価。オブジェクトには決められた仕事や処理が決まっている。これがクラスで定義するメンバーメソッドである。 | |
例)色鉛筆は実際に存在するものである。したがって、オブジェクトつまり「色鉛筆クラス」になる。(色鉛筆構造体)色鉛筆には様々な色があるメンバー変数として「色」「芯の長さ」を決める。 | |
class Color{ int R; int G; int B; } class ColorPen{ |
|
色鉛筆は、絵を描くことができる。メンバーメソッドを定義する。 | |
class Color{ int R; int G; int B; } class ColorPen{ void draw( ){ |
|
オブジェクト指向では、このように「モノ」と「それを扱う関数(メソッド)」が一緒にクラスとして定義されているので、「色鉛筆で食べ物を食べる」というミスは文法的に書けないことになっている。
整理すると「オブジェクト指向」では「モノ(データ、デバイスなど)を第1優先に考える」という分析・設計・実装方法である。 |
|
2.継承 | |
色鉛筆は鉛筆の一種であると考えられる。鉛筆でも絵を描くことができるが、色は黒一色である。色鉛筆では様々な色で絵を描くことができる。 | |
class Color{ int R; int G; int B; } class Pencil{ // 黒で絵をかく class ColorPen extends Pencil{ // colorで絵をかく |
|
このように定義すると「鉛筆クラスは鉛筆クラスの一種」という意味になる。このように、既存のクラスの一種であるクラスを定義することを「継承」という。色鉛筆クラスには「長さ」定義されていないが、鉛筆クラスで定義されているの で、色鉛筆クラスにも「長さ」が定義されていることになる。 この場合、色鉛筆クラスからみて鉛筆クラスを「スーパークラス」、「基底クラス」あるいは「親クラス」といい、鉛筆クラスから見て色鉛筆クラスを「サブクラス」あるいは「子クラス」という。 |
|
上のクラス図は、基底クラスとして「哺乳類クラス」、その子クラスとして「犬クラス」「猫クラス」そして「象クラス」を定義している。さらに「猫クラス」の子クラスとして「三毛猫クラス」「シャム猫クラス」を定義している。 |
|
3.カプセル化 | |
クラスのメンバー変数、メンバーメソッドは誰が触っても良いものと、触るクラスを限定したい場合がある。誰が触っても良いものを「public」、自分と同じパッケージ内のクラスからもしくはサブクラスからしか触れられない物を「protected」、そして自分自身のクラスからしかさわれない物を「private」という。 すべてのメンバー変数、メンバーメソッドをpublicにして、プログラマーたちが決め事としてさわらないようにと決めても良いが、中には決め事を守らないプログラマーもいるため、public、protected、privateを決めておけば文法的にコンパイラでチェックしてくれる。 何故そんなことをするのだろう。これは、作ったプログラムの一部を部品化しやすいようにするためである。オブジェクト指向では、作ったプログラムを部品化しておき、別のプログラムを作る際に再利用できるようにする。例えばインターネットブラウザのプログラムを作った場合、ネットワーク関係の部品は、次に作るメーラーに再利用ができる。このように部品化したクラスやパッケージは使い方さえ知っていればそのソースコードを知らない人でも使うことができる。ところが、内部(ソースコード)を知らないプログラマーが出てくるとバグの原因になる。そこで、protectedであれば勝手なことはされなくて済む。 基本的にメンバー変数はすべてprivateかprotectedにする。そして、参照するためのメソッドと代入するメソッドを用意する。このようなメソッドをアクセサメソッドと呼ぶ。なぜ、こんな面倒なことをするのか、理由は3つある。 1、メンバー変数の型を「int」から「double」に変更しようとした場合、参照する場合と代入する場合の2つに影響してくる。publicな変数だとプログラムすべてに渡ってこの変数を参照する場所と代入する場所を探すのは面倒な作業である。それに対しメソッドを探すのは比較的容易だからである。 2、メンバー変数は他のクラスから参照しても良いが値を変更するのは×という変数があったとする。この場合、参照するメソッドはpublicに、代入するメソッドはportectedかprivateにすればよい。 3、マルチスレッドプログラムにした場合、複数のスレッドが同じ変数にアクセスする場合がある。例えば、あるスレッドがリストをソース中に、別のスレッドがそのリストを参照した場合、矛盾が生じてしまう。このような場合は「セマフォ」というリストを参照する権利を与え権利があるスレッドだけがリストを参照したりさわったりできるうようにする。あらかじめ参照するためのメソッドを用意しておけばセマフォの処理を組み込む場合もそのメソッドをちょっと直すだけなので簡単である。 このように変数やメソッドにアクセスできるクラスを制御することで、あるクラスの部品のようにすることができる。部品のようになったクラスは別のプログラムを作るときにも利用できる。例えば、Javaでは標準でGUIや通信mその他さまざまなクラスがたくさん用意されており、通信をしたいと思えばそのためのクラスをファイル操作したければそのためのクラスをプログラマーが使用するだけだから、プログラムが簡単に書ける。また、携帯電話用のソフトを書きたければ携帯電話会社が公開しているクラス群が利用できる。 また、通信をするためのクラスを利用しようと思った場合、通常その中身がどんなプログラムになっているのか、プログラマーは知る必要がない。つまり、通信をするためのクラスの中身はブラックボックスということになる。 このように、中身を知らなくても部品のように使えるように設計することを「カブセル化」という。 |
|
4.ポリモーフィズム | |
ポリモーフィズムとは、ギリシャ語で「多数の形態」という意味である。プログラムで「ポリモーフィズム」というと同じメソッドを定義することをいう。 例に例えると「鉛筆クラス」の「絵を描くメソッド」と「色鉛筆クラス」の「絵を描くメソッド」は、若干機能がことなるが「絵を描くメソッド」というメソッドの名前は同じである。 例えばint型の絶対値を求めるメソッドを「abs」と名づけると小数も扱えるようなメソッドを追加しようとした場合、「abs_float」と名前を変えなくてはならなかった。Javaではポリモーフィズムによって、引数が異なれば同じ名前のメソッドを複数定義することもできる。このように同じ名前のメソッド(またはコンストラクタ)を作ることを、メソッドをオーバーロードするという。 |
|