ウィリアムのいたずらの、まちあるき、たべあるきーPART2

gooブログ「ウィリアムのいたずらの、まちあるき、たべあるき」がお引越ししてきました

Hello World以前のプログラム言語(その9:継承について)。


情報処理とは何?から、Hello Worldを各種言語で出力するまでの流れをかく、シリーズHello World以前のプログラム言語のつづきです(このシリーズは、土日に書きます)。

今回はオブジェクト指向の特徴として「継承」のお話なんですけど、その前に前回までのまとめをします。

■前回までのまとめ
●コンピューターは情報を処理する機械で、

●情報を処理するとは、
  必要な入力データ(情報)をいれて、
  なんらかの処理をさせて、
  目的となる出力データ(情報)を得る
 ことである。

●で、情報を処理するのには、処理内容を指示するわけですが、それがプログラムであり、

●そのプログラムは、以下の種類の文で構成される
  ・処理を命令する文
  ・条件によって、処理を分けるための文
     単純に条件をわける文
     繰り返しする文
  ・変数を宣言する文
     利用する変数を、どんなカタチで取っておくか宣言する
       →型  変数 のカタチの文
     いくつかのまとまりであらわす
       →単純にある変数を複数個集める:配列
       →いろんな型の変数をあつめて1つとして扱う:構造体

●で、プログラムに対して、データを入力するが、そのデータは
 従業員データなど、いろんなプログラムで何度も利用することが
 ある。そこで、それらを、ファイルという形で保存している
  ファイルは、おなじデータのかたまりの繰り返しになっていることが多い。
  このデータの塊が、レコードと言っている。 

●ファイルは入力だけでなく、ファイルに出力することもあるし、
 プログラムもファイルのカタチで書いて保存する
 →データと手続きをまとめて、クラスというもので記述する
 →オブジェクト指向でのクラスの概念を、プログラムを記述する上でも
  つかうといい

(赤字は前回やったところです)

 今日は、Javaの話にいくために、「継承」というお話をします。




オブジェクト指向の特徴
 オブジェクト指向は、3つの大きな特徴があるといわれています。
 以下の3つです。

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

 で、このうち、カプセル化とは、データとプログラム(操作:メソッド)をクラスにまとめてしまうことによって、データを公開しないで(=隠蔽できて)、メッセージをやり取りする(実際にJavaでの場合は、操作プログラム=メソッドを呼び出すことにより)部分のみを公開すればよくなることです。
 こうすると、データを直接操作されてしまうと、いろんなところに修正部分がひろがってしまうけど、クラスのメソッドを使ってもらう場合、そのクラスのメソッドだけを修正すれば言いということで局所化することができるようになります。

 っていうはなしで、つまり、今まで話してきた、データとプログラムをクラスにまとめましょうというお話です。




■継承

 で、今日は継承の話なんですが、まえに、サブルーチンという話をしました。
 これは、共通の処理をするものを、サブルーチンとしてまとめて、必要なときは、それを呼び出すことによって、いちいち書くのを省略するというものです。

 では、この考え方はオブジェクト指向では、どうなっているのでしょうか?
 オブジェクト指向において、いくつかのオブジェクトが、共通の性質を持っているということがあります。たとえば、

・ウィリアムのいたずら
・松坂投手
安倍総理大臣
安藤美姫さん

とあつめると、みんな、日本人という共通の性質を持っています。

で、さらに
ブッシュ大統領
金正日
とあつめると、ブッシュさんや金正日さんは、日本人という性質は持っていませんが、人類という共通の性質を持っています。

 このように、日本人というクラスを考えた場合、そいつは、人類(こいつもクラス)という性質ももっています。このように、あるクラス(本当はオブジェクトだけど、ここでは、日本人)が他のオブジェクト(ここでは人類)の特徴を引き継ぐことを、「継承」といいます。


つまり
 人類
  |
 日本人
  |--------*----------*ーーーーーー
  |        |          |
 安倍総理大臣  ウィリアムのいたずら  安藤美姫さん


みたいなかんじで、継承されています。




■多重継承

 このとき、安倍総理大臣について考えると
ブッシュ大統領
金正日
安倍総理大臣
 とまとめると、国家のえらいひとというクラスもできそうです。

そーすると安倍総理大臣は

  人  類
  |  |
日本人 国家の偉い人
  |  |
 安倍総理大臣

となってしまい、2つの性質をもっています。
こういうように2つ以上の複数のクラスから継承される(性質をもっている)ものを、
多重継承といいます。




■多重継承だとこまること

 この場合、こまることがあります。

 日本人が車に乗る

 という操作を考えた場合、ふつう、車に乗って、自分が運転します。

 で、その一方で

 国家の偉い人が車に乗る

 という操作を考えた場合、ふつう、運転手がいて、SPがついて。。。

 っていうことで、ぜんぜん違います。

 じゃあ、安倍総理大臣が車に乗るときは。。。
 どーなんでしょーねー、ウィリアムのいたずらは知りませんが、とにかく、どっちになるのだかわかりません。

 このように、継承する元が2つあって、その元で、定義されていることがまったく違う場合、こまりますよね。どっちが継承されるのか??

 Javaの場合、こうならないため、あるきまりがありますが、それは、このシリーズのもっと先にかきます。




■ちなみに、のこりの「ポリモーフィズム」について

 たとえば、Hello Worldっていうのを出す場合、出力するメソッド(printあるいはprintlnというメソッド)をつかいます。

 このとき、出力メソッドに"Hello World"という文字列をわたすと、文字コードとして判断して、それを文字として表示します。

 で、同じ出力するメソッド(print)に、整数(int)をわたすと、整数として判断して、整数の文字列に変換して表示します

 そして、渡すモノ(型)によっては、16進表示したり、先頭アドレスを表示したり、中身を展開して表示したり。。と、

  「引数の型にあわせて、同じ関数なのに、テキトーに表示して」

くれます。

 この、同じメソッドなのに引数に渡す型によって、処理が様々に変わる(多様に変わる)のが、多様性「ポリモーフィズム」です。(多態性ともいいますっていうか、いろいろいいます ^^;)

 実際Javaでは、同じ関数を、いろんな型の引数でかけます。
(だから、上記のprin関数は、いろんな型で、いろんなふうに動く)




 ということで、次回のこのシリーズでは、オブジェクト指向で言語を表現するには、どんなふうになるのか?っていうことを書きます。