継承の仕組み
**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第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/

![P・F. ドラッカー: マネジメント[エッセンシャル版] - 基本と原則](http://ecx.images-amazon.com/images/I/41AY8WEF74L._SL75_.jpg)




















Recent Comments