ポリモーフィズムの仕組み
**************************************************************
_/_/_/_/_/_/_/ ソフトウェア業界 新航海術 _/_/_/_/_/_/_/_/_/
**************************************************************
第201号 2008/3/10 『ポリモーフィズムの仕組み』
▼ まえがき
▼ [オブジェクト指向再入門] (1)OOPを過大でも過小でもなく見る
▼ [オブジェクト指向再入門] (2)ポリモーフィズムの一般的な説明
▼ [オブジェクト指向再入門] (3)占いクラスを継承した占星術クラス
▼ [オブジェクト指向再入門] (4)継承するということの意味
▼ [オブジェクト指向再入門] (5)第200号「継承の仕組み」のおさらい
▼ [オブジェクト指向再入門] (6)占いクラスを継承した四柱推命クラス
▼ [オブジェクト指向再入門] (7)ポリモーフィズムとは
▼ 次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
まえがき
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
蒲生嘉達(がもうよしさと)です。
2月12日に「ソフト会社の心臓」を出版しました。
Amazonで「なか見!検索」もできます。
http://amazon.co.jp/exec/obidos/ASIN/4779002958/keiitteanifty-22
「ソフト会社の心臓」は下記のメルマガやブログでも取り上げられました。
中国オフショア開発最前線
http://snic.livedoor.biz/archives/51241499.html
新・中国ビジネス入門
http://www.ai-coach.com/backno/ciplatest.html
今回も引き続き、オブジェクト指向プログラミングについて解説します。
「オブジェクト指向プログラミング」は本文では「OOP」と略します。
英語の'Object Oriented Programming'の略です。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (1)OOPを過大でも過小でもなく見る
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
私は「オブジェクト指向でなぜつくるのか」での平澤章氏の下記の
主張に賛成します。
(1)下流工程のオブジェクト指向(OOP)、上流工程のオブジェクト指向
(モデリング)、全体をカバーするオブジェクト指向(UML、開発
プロセス)は、個別に見るとそれぞれ随分違うものである。
(2)OOPは決して従来技術からの飛躍ではなく、連綿と続いてきた
プログラム言語の進化の延長線上にある。
(3)OOPは純粋なプログラミングの仕組みとして捉えるべきである。
そして、メモリの側からOOPを見たとき、私は初めてOOPを過大でも
過小でもなく等身大に捉えられた気がしました。
第199号では、クラスが静的領域にロードされ、インスタンスが
ヒープ領域に生成される様子を見ました。
第199号:クラスのロードからインスタンスへの情報設定まで
http://www.gamou.jp/sailing/2008/02/post_a0f2.html
第200号では、継承が実現される様子を見ました。
第200号:継承の仕組み
http://www.gamou.jp/sailing/2008/02/post_968a.html
今週号では、ポリモーフィズムが実現される様子を見てみましょう。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (2)ポリモーフィズムの一般的な説明
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
ポリモーフィズムは一般には次のように説明されます。
> ポリモーフィズム(Polymorphism)とは、主にオブジェクト指向
> プログラミングで、あるオブジェクトへの操作が呼び出し側(sender)
> ではなく、受け手のオブジェクト(receiver)によって定まる特性のこと。
> (「ウィキペディア(Wikipedia)」より)
> オブジェクトが、自分の動作に責任を持って、自立的に動作すること。
> オブジェクトの型ではなく、生成されたオリジナルのクラス型で
> 実装されたメソッドが起動するために、同じ型のオブジェクトに対して、
> 同じメソッド呼び出しを実行しても、生成されたオリジナルのクラスが
> 異なれば、異なるメソッドが起動される。
> (「浅煎り珈琲Java アプリケーション入門」
> http://www.nextindex.net/java/polymorphism.html より )
読者は理解できますか?
私は理解できませんでした。
次のような説明はいかがでしょうか?
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (3)占いクラスを継承した占星術クラス
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
占いクラスとそれを継承した占星術クラスを例にして説明します。
「図201-1:占星術クラスの動き」
( http://www.kei-it.com/sailing/2008/201-1.htm )を参照しながら
説明を読んでください。
図中の「リスト1.占いクラス」に示すように、占いクラスには次の
4つのメソッドが存在します。
・姓設定
・名設定
・誕生日設定
・鑑定
一方、占星術クラスには、「リスト2.占星術クラス」に示すように、
自前のメソッドとしては「鑑定メソッド」だけが存在します。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (4)継承するということの意味
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
第200号で解説したとおり、継承するということは次のことを意味します。
【メソッドテーブル】
占星術クラスのメソッドテーブルが静的領域に作られます。
そして、その中には、占星術クラスのメソッドへのポインタだけでなく
占いクラスのメソッドへのポインタも含まれます。
【インスタンスのメンバ変数】
また、占星術クラスから生成された占星術インスタンス福田康夫には、
占いクラスのメンバ変数が継承されます。
つまり、占星術インスタンスには占いインスタンスのメンバ変数
(姓、名、誕生日、性、鑑定)が含まれます。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (5)第200号「継承の仕組み」のおさらい
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
「図201-1:占星術クラスの動き」中の(A)から(D)までは
インスタンス福田康夫の姓変数に"福田"を設定する処理が実行される
様子を表しています。
(E)から(H)まではインスタンス福田康夫の鑑定変数に鑑定結果を
設定する処理が実行される様子を表しています。
どちらも第200号「継承の仕組み」のおさらいですが、念のため
解説しておきます。
【姓の設定】
(A)OSはインスタンス福田康夫に関連付けられているメソッドテーブルを
参照する。
(B)そのメソッドテーブルの中で姓設定メソッドへのポインタを探す。
→占いクラスから継承された姓設定メソッドへのポインタを見つける。
(C)見つかった姓設定メソッドを実行する。
(D)姓設定メソッドは、インスタンス福田康夫の姓変数に"福田"を
設定する。
【鑑定の設定】
(E)OSはインスタンス福田康夫に関連付けられているメソッドテーブルを
参照する。
(F)そのメソッドテーブルの中で鑑定メソッドへのポインタを探す。
(G)見つかったら、その鑑定メソッドを実行する。
(H)鑑定メソッドは、インスタンス福田康夫の鑑定変数に鑑定結果を
設定する。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (6)占いクラスを継承した四柱推命クラス
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
さて、占いには占星術以外にも様々な流派があります。
四柱推命、姓名判断、前世占い、東洋占星術など・・・。
鑑定するために必要なデータは大概、姓、名、誕生日、性ですが、
鑑定ロジックは流派によって全く異なります。
したがって、様々な占いに対応するためには流派ごとにサブクラスが
必要となります。
「図201-2:四柱推命クラスの動き」
( http://www.kei-it.com/sailing/2008/201-2.htm )は四柱推命
クラスの例です。
占星術クラスと同じく、占いクラスを継承しています。
四柱推命クラスの動きは占星術クラスと同じなので、説明は省略します。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
[オブジェクト指向再入門] (7)ポリモーフィズムとは
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
図201-2の中の「リスト3.占星術呼び出し元」と「リスト5.四柱推命
呼び出し元」を比べてみてください。
インスタンスの生成部分( 占星術 福田康夫 = new 占星術(); など)
のみが異なり、ロジック部分は全く変わっていないことに気づくでしょう。
同じような処理をCで書く場合、呼び出し側で共通処理(姓設定など)と
個別処理(鑑定)を意識し、且つ、個別処理は占星術鑑定関数とか
四柱推命鑑定関数とか関数に別名を付けなければなりません。
しかし、OOPの場合、メソッド名も同じで行けます。
これがはるか上で引用したポリモーフィズムの解説文
「オブジェクトの型ではなく、生成されたオリジナルのクラス型で
実装されたメソッドが起動するために、同じメソッド呼び出しを実行
しても、生成されたオリジナルのクラスが異なれば、異なるメソッドが
起動される」の意味するところです。
これがポリモーフィズムであり、フレームワークはその応用編となります。
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降の予告
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
次回以降で、クラスライブラリ、フレームワークへと話を進めていきます。
次回発行予定は、3月下旬です。
乞うご期待!!
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
本メルマガについて
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
私は中小ソフトウェア会社の経営者なので、(特に日本の)ソフト
ウェア業界、ソフトウェア産業について強烈な興味を持っています。
技術面だけでなく、会計面、法律面、人事面など様々な面において・・・。
そして、私はものごとを見るときに次のことを心がけています。
・あるものをあるがままに見る。
色眼鏡(例えば権威者の意見)でものを見ない。
・くっきりはっきり見る。
複雑な現実も、ある観点から見ると、あるいはある角度から光を
あてると、くっきりはっきり見えてくる。
・批判だけではなく、明るく前向きな解決策を提示する。
この視点で見えてきたことを本メルマガに綴っています。
本メルマガの内容に興味を持つであろう方をご存知なら、是非、
本メルマガの存在を教えてあげてください。
(以下をそのまま転送するだけです。)
---------------------------------------------------
【お勧めメルマガ ソフトウェア業界 新航海術】
⇒ 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
(但し、慶社員には社内のメーリングリストで配信しています。)
「まぐまぐ!」での読者数は2007年3月8日現在、669名です。
バックナンバーは、発行者サイトまたはブログで、体系として
見てもらいたいので、「まぐまぐ!」でのバックナンバー公開は
最新号のみとなっています。
バックナンバーブログ:http://www.gamou.jp/sailing/
発行者Webサイト: http://www.kei-it.com/sailing/
(発行者Webサイトではバックナンバーの全文検索も可能です。)
☆筆者の趣味のブログ:身近にいる小動物の図鑑☆
http://www.gamou.jp/small/
| Permalink
|






















Comments