************************************************************** _/_/_/_/_/_/_/
ソフトウェア業界 新航海術
_/_/_/_/_/_/_/_/_/ ************************************************************** 第200号
2008/2/25 『継承の仕組み』 ▼ まえがき ▼ [オブジェクト指向再入門] (1)OOPは従来技術からの飛躍ではない ▼
[オブジェクト指向再入門] (2)ヒープ領域の獲得・解放での違い ▼ [オブジェクト指向再入門] (3)継承を実現するための仕組み ▼
[オブジェクト指向再入門] (4)サブクラスのインスタンス化 ▼ [オブジェクト指向再入門] (5)自分のメソッドの実行 ▼
[オブジェクト指向再入門] (6)継承されたメソッドの実行 ▼ 次回以降の予告 ▼
メルマガ紹介
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= まえがき *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
蒲生嘉達(がもうよしさと)です。
2月12日に「ソフト会社の心臓」販売開始しました。 詳細は下記のページを参照してください。
http://www.kei-it.com/y_gamou/heart/
今回も引き続き、オブジェクト指向プログラミングについて解説します。 「オブジェクト指向でなぜつくるのか」(平澤章著、日経BP社発行)を 参考にしています。
「オブジェクト指向プログラミング」は本文では「OOP」と略します。 英語の'Object
Oriented
Programming'の略です。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (1)OOPは従来技術からの飛躍ではない *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
私は「オブジェクト指向でなぜつくるのか」での平澤章氏の下記の 主張に賛成します。
(1)下流工程のオブジェクト指向(OOP)、上流工程のオブジェクト指向 (モデリング)、全体をカバーするオブジェクト指向(UML、開発 プロセス)は、個別に見るとそれぞれ随分違うものである。
(2)OOPは決して従来技術からの飛躍ではなく、連綿と続いてきた プログラム言語の進化の延長線上にある。
(3)OOPは純粋なプログラミングの仕組みとして捉えるべきである。
第199号では、クラスが静的領域にロードされ、インスタンスが ヒープ領域に生成される様子を見ました。
図1から図5まで(
http://www.kei-it.com/sailing/2008/199.htm
)を 見ると、上記(2)「OOPは決して従来技術からの飛躍ではない」が 実感できます。
例えば「図5:2つのインスタンス」
http://www.kei-it.com/sailing/2008/199.htm#5 は、Cで書かれた プログラムが実行されているときのメモリの状態とそっくりです。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (2)ヒープ領域の獲得・解放での違い *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
但し、次の2点で大きな違いがあります。
一つは、Cではヒープ領域の獲得・解放をプログラム側で制御する のに対し、OOPでは実行環境が制御するという点です。
具体的に言うと、Cでは
malloc と free が必要なのに対し、 Javaでは new
だけで済むということです。
関連記事:第198号「インスタンスはヒープ領域に作られる」 http://kei-it.tea-nifty.com/sailing/2008/01/post_6f91.html
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (3)継承を実現するための仕組み *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
二つ目の違いはメソッドテーブルです。
「図3:姓の設定」
http://www.kei-it.com/sailing/2008/199.htm#3
で描かれているとおり、OOPではメソッドテーブル経由でメソッド コードが呼び出されます。
一方、Cではプログラマが自前で関数ポインタテーブル経由で呼ぶような 制御ルーチンを作らない限り、直接関数コードが呼び出されます。
このように言うと、Javaプログラマは「自分はメソッドテーブル経由 ではなく、直接メソッドを呼んでいる」と言うでしょう。
メソッドテーブルはプログラマからは見えないからです。
では、なぜメソッドテーブルが存在するのでしょうか?
それは、継承とポリモーフィズムを実現するための仕組みだからです。
(他にも継承やポリモーフィズムの実現方法はあるようですが、ここでは 「オブジェクト指向でなぜつくるのか」にならってメソッドテーブルで 説明しています。)
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (4)サブクラスのインスタンス化 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
「図6:継承」http://www.kei-it.com/sailing/2008/200-6.htm を 参照してください。
人クラスを継承している歌手クラスを想定して書かれています。 この継承は、Javaでなら次のような表記になります。
class
歌手 extends
人{ }
「図6:継承」は、歌手インスタンス倖田來未が生成されたときの メモリの状態です。 Javaでなら「歌手
倖田來未 = new
歌手();」が実行されたときの メモリの状態です。
「図6:継承」では次のことが表現されています。
(A)コードのロード
歌手クラスのコード(デビュー曲設定メソッド、所属設定メソッドの コード)は静的領域にロードされます。
(B)メソッドテーブル
歌手クラスのメソッドテーブルが静的領域に作られます。 そして、そのメソッドテーブルには次の二つが含まれます。 ・人クラスのメソッドへのポインタ ・歌手クラスのメソッドへのポインタ
サブクラスのメソッドテーブルにはスーパークラスのメソッドへの ポインタも含まれているということが重要です。
(C)インスタンス
歌手クラスから生成された歌手インスタンス倖田來未には、 人クラスのメンバ変数が継承されています。
つまり、歌手インスタンスには人インスタンスのメンバ変数 (姓、名、誕生日、性)が含まれています。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (5)自分のメソッドの実行 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
「図7:デビュー曲設定」http://www.kei-it.com/sailing/2008/200-7.htm
は、インスタンス倖田來未のデビュー曲変数に"TAKE
BACK"を設定する 処理が実行される様子を表しています。
Javaでなら「倖田來未.デビュー曲設定("TAKE
BACK");」が実行される 仕組みです。
(A)OSはインスタンス倖田來未に関連付けられているメソッドテーブルを 参照する。 (B)そのメソッドテーブルの中でデビュー曲設定メソッドへのポインタを 探す。 (C)見つかったら、そのデビュー曲設定メソッドを実行する。 (D)デビュー曲設定メソッドは、インスタンス倖田來未のデビュー曲 変数に"TAKE
BACK"を設定する。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= [オブジェクト指向再入門] (6)継承されたメソッドの実行 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次に継承されたメソッドが実行される仕組みを見てみましょう。
「図8:継承されたメソッドの使用」
http://www.kei-it.com/sailing/2008/200-8.htm は、インスタンス 倖田來未の姓変数に"倖田"を設定する処理が実行される様子を表 しています。
Javaでなら「倖田來未.姓設定("倖田");」が実行される仕組みです。
(A)OSはインスタンス倖田來未に関連付けられているメソッドテーブルを 参照する。 (B)そのメソッドテーブルの中で姓設定メソッドへのポインタを探す。 →人クラスから継承された姓設定メソッドへのポインタを見つける。
(C)見つかった姓設定メソッドを実行する。 (D)姓設定メソッドは、インスタンス倖田來未の姓変数に"倖田"を 設定する。
メソッドテーブルは、コードの重複を排除する役割を果たしている ことが分かります。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= 次回以降の予告 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降で、ポリモーフィズム、クラスライブラリ、フレームワーク へと話を進めていきます。
次回発行予定は、3月初旬です。
乞うご期待!!
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= メルマガ紹介 *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
私が購読しているメルマガの一つを紹介します。 経験に基づく様々なノウハウが盛り込まれています。
------------------------------------------------------------ 「コンピュータシステムはなぜ機能しないのか?」 〜利益を大幅にアップさせるシステム設計の裏ワザ〜
SE、プログラマだけでなくユーザーを含むシステム開発に関わる全 ての方々へ。納得のいく、利益を生むシステム作りの裏ワザを業界 暦20余年のSEがマネジメント、プロジェクト管理、プログラミング、 保守、人材育成を踏まえて伝授します。相互紹介募集中です。
ご登録はこちらから
http://www.mag2.com/m/0000155977.html ------------------------------------------------------------
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= 本メルマガについて *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
私は中小ソフトウェア会社の経営者なので、(特に日本の)ソフト ウェア業界、ソフトウェア産業について強烈な興味を持っています。 技術面だけでなく、会計面、法律面、人事面など様々な面において・・・。
そして、私はものごとを見るときに次のことを心がけています。
・あるものをあるがままに見る。 色眼鏡(例えば権威者の意見)でものを見ない。
・くっきりはっきり見る。 複雑な現実も、ある観点から見ると、あるいはある角度から光を あてると、くっきりはっきり見えてくる。
・批判だけではなく、明るく前向きな解決策を提示する。
この視点で見えてきたことを本メルマガに綴っています。
本メルマガの内容に興味を持つであろう方をご存知なら、是非、 本メルマガの存在を教えてあげてください。
(以下をそのまま転送するだけです。) --------------------------------------------------- 【お勧めメルマガ ソフトウェア業界 新航海術】 ⇒
http://www.mag2.com/m/0000136030.htm または http://kei-it.tea-nifty.com/sailing/ または http://www.kei-it.com/sailing/ --------------------------------------------------
このメールマガジンは『まぐまぐ!』
http://www.mag2.com/ を利用して 発行しています。配信中止はこちら
http://www.mag2.com/m/0000136030.htm (但し、慶社員には社内のメーリングリストで配信しています。)
バックナンバーは、発行者サイトまたはブログで、体系として 見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は 最新号のみとなっています。
バックナンバーブログ:http://kei-it.tea-nifty.com/sailing/ 発行者Webサイト:
http://www.kei-it.com/sailing/ (発行者Webサイトではバックナンバーの全文検索も可能です。)
☆筆者の趣味のブログ:身近にいる小動物の図鑑☆ http://kei-it.tea-nifty.com/small/
|
|
<< [第199号]
[全バックナンバー]
[オブジェクト指向再入門] [第201号] >>
|