Java.use(better, Python)《6》継承に警鐘を鳴らす(その陸)
|記事一覧|《こちらに移動中です》2006年6月12日 (月)
Java.use(better, Python) # Stairway to Real Agile World
《6》継承に警鐘を鳴らす(その陸)《Jython2.5.0》
■ 概要
継承の概念を実現するのに、いくつかの方法があります。そのひとつが、新しいクラスに対して、すべてのインスタンスに共通のメソッドを定義した後で、そのインスタンスに固有のメソッドを再定義するというものです。これによって(2c)クラスとインスタンス間の継承を実現できます。
継承には、
(1)構造継承
(2)機能継承
(3)プロトコル継承
があって、さらに(2)機能継承は、次の3つに分類されます。
(2a)親子関係にあるクラス間の継承
(2b)親子関係にないクラス間の継承
(2c)クラスとインスタンス間の継承
ともすると、Java/C# などでは、狭義の(2a)に関心が寄せられがちです。しかし、純粋な OOP の世界では、その限りではありません。では、広義の継承は、どのように実現するのでしょうか。
《6》継承に警鐘を鳴らす(その陸)
新しいクラスを定義した後で、そのインスタンスに固有のメソッドを再定義することには、どのような意味があるのでしょうか。
# Jython class MyObject: def hello(self): print "hello, world" def happy(): print "happy birthday"
クラス MyObject では、メソッド hello を定義しています。また、このモジュールでは、関数 happy を定義しています。def 文は、関数オブジェクトを生成して、これを関数名 happy に代入します。
# Jython m4 = MyObject() m4.hello = happy m4.hello() # -------------------------------- Output -- happy birthday
式 m4.hello() を評価すると、変数 m4 が束縛するオブジェクトで再定義された、メソッド関数 hello を呼び出します。すると、文字列 happy birthday が出力されます。関数もオブジェクトなので、インスタンス辞書に登録できます。代入文 m4.hello = happy を実行すると、m4 のインスタンス属性 hello に、関数オブジェクト happy が代入されます。
# Jython print m1.hello # -------------------------------- Output -->
文 print m1.hello を実行すると、変数 m1 が束縛するオブジェクトの属性 hello に関する情報が出力されます。これから、hello は、MyObject のクラス辞書に登録された`メソッド関数`であることが分ります。
# Jython print m4.hello # -------------------------------- Output --
文 print m4.hello を実行すると、変数 m4 が束縛するオブジェクトの属性 hello に関する情報が出力されます。これから、hello は、そのモジュール内で定義された`関数オブジェクト`であることが分ります。
# Jython print hello # -------------------------------- Output --
文 print hello を実行すると、同じ情報が出力されます。よって、m4 のインスタンス辞書に登録されたキー属性 hello を参照すると、関数オブジェクト happy と同じものが得られることが分ります。
式 m4.hello を評価すると、m4 のインスタンス辞書の中から、キー項目 hello に対する値として、関数オブジェクト happy が得られます。そして、式 m4.hello() は、その関数呼び出しとして解釈されます。すると、文字列 happy birthday が出力されます。
# Jython print m1.__dict__ # -------------------------------- Output -- {}
変数 m1 が束縛するオブジェクトのインスタンス辞書には、属性が存在しません。
# Jython print m4.__dict__ # -------------------------------- Output -- {'hello':}
変数 m4 が束縛するオブジェクトのインスタンス辞書には、キー項目 hello に対する値として、関数オブジェクト happy が登録されています。
==================================
後藤いるか+伊藤うさぎ 著 ◆ 監修:小泉ひよ子とタマゴ倶楽部