[SML 7530] Re: オーバロードはポリモフィズムか?
Sako Hiroshi
sakoh @ ba2.so-net.ne.jp
2009年 5月 2日 (土) 18:14:22 JST
酒匂です。
> そもそもポリモフィズムの定義って何ですかね。
Polymorphism (多相性)の本来の意味は、ある「名前」で参照されるものの
実体として、 多く(poly) の形(morph)をとることができるという
だけですね。
anObject
という名札(変数)をプログラムテキスト中にみたとしたら、
それは、その文脈で anObject という名前で「呼ばれている」
ある実体を示しているわけです(もちろん未初期化 ... 特定の
実体と関連付けられていない場合もあります)。
よく Smalltalk や Ruby は型のない言語だと言われますが、
実体(オブジェクト)そのものに型はあって、ただ
プログラムテキスト中に現れる名札(変数)に
事前に受け入れ可能な型が定義されていないというだけに
過ぎません。
さて Smalltalk などでは、anObject という変数に
任意の実体を代入できますから、anObject は多相的です。
また強い型付けのある言語では
anObject : aType
などとして(言語は特定していません)anObject が受け入れ可能な
実体の型を宣言することができますが、通常は aType だけではなく
aType から派生した型の実体も受け入れ可能であることを意味して
います。この場合 aType の実体、aTypeのサブタイプの実体などが
anObject と結びつきますから、やはり多相性があるということに
なります。
さて、こうしてポリモフィズム(多相性)そのものは、「ある名札(変数)
に、「複数」の「形」の実体を代入できるということ」であることがわかりました。
で、次のステップです。
多相性があるということは、プログラムテキスト中に
anObject.my_method(arg)
とか
anObject myMetho: arg
という表記を見ても、実行時にはどこで定義されている my_method なり
myMethod が呼び出されるか、実行前には決定する事が
できないことを意味します。
anObject.my_method(arg)
の地点に実行がさしかかると、anObject が多相的な名札(変数)の場合
実体のクラスは aType とは限りませんから、実際に結びついている
実体の型を調べて、その型に定義されている my_method(arg) を呼び出す
必要があります。このように実行時に結びつくべきメソッドを決める
ことを動的束縛 (dynamic bindings) と呼びますよね。
ということで、
多相性+動的束縛
により、オブジェクト指向システムは柔軟性を手に入れています。
さて、そうすると、次の疑問は動的に束縛すべき相手を
どのように決定するかということになるわけですね。。。
オーバーロードのない言語なら、単純に my_method の定義が見つかるまで
検索して呼び出す・・・すなわちメソッド名を検索キーにして
上位クラスに向かって探しに行くだけですが、オーバーロードがある言語の場合
メソッド名とシグニチャをキーにして検索しにいくということですね。
ということで、やっと最初の疑問に戻るのですが、
「ポリモフィズムを実現する方法。。。」
という表現は
「ポリモフィズムに対する動的束縛を支援する方法として
オーバーライド(再定義)やオーバーロード(多重定義)がある」
といった表現が省略されたものと考えることができるのではないでしょうか。
ここまで書いてきて、このメーリングリストのメンバーには
釈迦に説法の内容だなと思いましたが、一応お送りすることと致します。
以上です。
2009/4/30 Hidetaka MASUDA <masuda @ im.dendai.ac.jp>:
> 増田@電大です。
>
> 最近、悩んでいることがあります。「ポリモフィズムを実現する方法の一つに
> オーバロードがある」って書いてあるWebページをよく見るんです。何か気持悪
> いんです。メソッドのシグネチャ (メソッド名、引数、戻り値の型) が違うのに
> ポリモフィズムと言うんだろうかと。
>
> ・抽象クラスの抽象メソッドを具象クラスでオーバライドする
> ・(Javaなどの)インタフェースを宣言して、実装クラスでメソッドを実装する
>
> の2つはポリモフィズムを実現する方法だと思うんですが。なぜなら、メッセー
> ジの送り手は一切変更なしで動きますよね。オーバロードは引数の数なんかが変
> わったら送り手はそれに合わせて変更しないとだめですよね。
>
> そもそもポリモフィズムの定義って何ですかね。
>
> 「同じメッセージを異なるオブジェクトに送った場合、メッセージを受け取った
> オブジェクトの種類によって異なる動作をしてもよい。」と思っていたんです。
> 「同じメッセージ」とは「メソッドのシグネチャが同じ」という意味です。
> 「メッセージ名が同じ」という意味ではありません。
>
> いかがでしょうか?
>
> --
> ------
> 〒101-8457 東京電機大学 未来科学部 情報メディア学科 増田 英孝
> E-mail: masuda @ im.dendai.ac.jp TEL 03-5280-3551
> http://www.cdl.im.dendai.ac.jp/%7emasuda/ FAX 03-5280-3592
> It's more fun to compute!
>
--
Sako Hiroshi
http://d.hatena.ne.jp/ardbeg1958/
SML メーリングリストの案内