« Bitmap.Drawを最大限に活用するには | main | ActionScript3.0 リファレンス »
2005年10月14日
静的関数のオーバーライドが不審な挙動をするのですが、バグですか?
Staticなクラスを継承して、Static関数をオーバーライドするとなんかすっげぇ挙動不審な動作をする。
これ仕様なの??
まず、以下のような関数を作ります。
class Static1{ static function hoge(){ hogehoge(); } private static function hogehoge(){ trace("Static1:hogehoge"); } }
関数hogeを呼ぶと、内部的に関数hogehogeを呼び出し、"Static1:hogehoge"と出力するクラスです。
次にこのクラスStatic1を継承して、クラスStaci2を作成します。
Static2では、プライベート関数hogehogeをオーバーライドして、"Static2:hogehoge"と出力するようにします。
class Static2 extends Static1{ private static function hogehoge(){ trace("Static2:hogehoge"); } }
で、これをflaから呼び出すと
Static1.hoge()
Static2.hoge()
期待される動作は
Static1:hogehoge Static2:hogehoge
ですが、実際には
Static1:hogehoge Static1:hogehoge
と返されます。なんかオーバーロードが無視されてる。
どうやらStatic関数の場合、superクラスの関数から、サブクラスの関数を予防としてもサブクラスのオーバーライドを無視して、superを参照する模様。
何が困るって静的クラスにテンプレートパターンが使えないじゃないですか。
内部的にシングルトンにすれば動くけど、それもなんか微妙なような…
今まで気づかなかったのだけど、これ仕様なんすか?
投稿者 Taka : 2005年10月14日 13:31
book
bookmark
trackbacks
this entry's trackback URL:
http://www.fladdict.net/cgi-bin/mt3/mt-tb.cgi/348
comment
こんばんは
AS2.0のリフレクションをどうにかして実現するために試行錯誤していた時、
私は、この現象にぶつかりました。
そのときのメモを今回に置き換えると…
Static2.hogeを参照することで
Static2にhogeが定義されていないから
Static2.prototype["__constructor__"]で親クラスStatic1中にあるhogeを返します。
つまり
Static2.hoge === Static2.prototype["__constructor__"]["hoge"]
なのです。
ここで
Static2.prototype["__constructor__"] === Static1
を考えると
Static2.hoge === Static1.hoge
つまり
staticな関数を呼び出すとは、定義されているクラスのコンストラクタが呼び出すことになる。
よって、仕様ではないかと推測しました。
ご参考までに…。
by arkw : 2005年10月14日 22:13
あぁ、arkwさんも詰まってましたか、
なんかkey氏曰く、Static関数は「オーバーライド」ではなく「隠蔽」というものが行われるらしく、superからサブクラスの呼び出しルールが微妙に違うのだそうです。
ぜーぜん、知りませんでした(汗
by Taka : 2005年10月18日 00:40
こんばんは
かなり詰まって煮詰まってました。
「隠蔽」っていうんですねぇ。
Static関数は取り扱い注意ですね^^;
by arkw : 2005年10月18日 20:04
というか、オブジェクト指向的にstaticのオーバーライドって許されているのでしたっけ?
なんか矛盾がある気が・・・。オブジェクト指向的でなくても・・。
by ゆきづり : 2005年10月18日 22:01
おはようございます。
そうですね。staticですから基本的にオーバライドはありえないはずですね…。
by arkw : 2005年10月19日 09:09
いやー、ここら辺は全然勉強ぶそくでした。
Staticって上書きしちゃあいけないんですね。知りませんでした…
うーん自己流だとやっぱ穴がいっぱいだなぁ、自分。
by Taka : 2005年10月21日 00:48