- 2009年3月21日 23:30
- ActionScript 3.0 | Flash | etc.
発売日に購入したものの、あまりCS4を使用してこなかったのですが
最近になって、ようやくさわり始めました。
ところがどっこいCS4。なかなかの難物です。
CS3で普通に動いていたものが動きませんでした。
発生した問題と、検証した結果、その回避策について
ここに覚書として書いておきます。
(前回もそうでしたが、早くも追記しました。)
注:おそらくCS4のバグなので、修正はいるかもです
最近になって、ようやくさわり始めました。
ところがどっこいCS4。なかなかの難物です。
CS3で普通に動いていたものが動きませんでした。
発生した問題と、検証した結果、その回避策について
ここに覚書として書いておきます。
(前回もそうでしたが、早くも追記しました。)
注:おそらくCS4のバグなので、修正はいるかもです
今回書く『不可解な挙動』に絡んでいるのは
private class です。要するにこういうやつですね。
package{
public class Hoge{
//...
}
}
class Fuga{} // ←これ
この private class はとある条件下でかなり厄介な症状を引き起こします。
症状と回避策
その厄介な症状とは、複数の private class を作った場合
もしくは、何のクラスも継承せずに
インターフェースだけ実装した場合などに
○○が無い、○○が未定義というエラーがやたら起こります。
特に、インターフェース実装している場合に多いです。
例えば以下のようなコードはエラーになります。
・IHoge インターフェース
package{
public interface IHoge{
function myfnc():void;
}
}
・Hoge クラス
package{
public class Hoge implements IHoge{
public function myfnc():void{}
}
}
class Fuga{}
この場合、myfnc が実装されていません。
という怒られ方をします。
解せませんね・・・、実装してるっちゅうに。
これ以外にもいろいろ発生条件があり、調査中なのですが
とにかく private class を書く人は要注意です。
打つ手なしか・・・と思ってたのですが
つい先ほど、回避策を発見しました。
それはなんとも無駄な実装なのですが
なんでもないクラスを一個作りそれを継承させる
という方法です。
まず、こういうなにもないクラスを作ります。
package{
public class Foo{}
}
これを private classに継承させます
package{
public class Hoge implements IHoge{
public function myfnc():void{}
}
}
class Fuga extends Foo{}
これでなぜかエラーが出なくなります。不思議です。まさに不可解です。
ちなみに複数 private class があるときは、片方でもOKでした
こんな感じで
package{
public class Hoge implements IHoge{
public function myfnc():void{}
}
}
class Fuga extends Foo{}
class Fuga2{}
ただしいくらなんでもこの方法は無駄すぎるのでもう少し調べる必要がありそうです。
完全な原因、もしくはもうすこしマシな回避方法が見つかったら
また、記事にまとめようと思います。
- Newer: AS3.0 TextField生成処理の速度検証
- Older: Flashが何故かうまく動かない時に疑うべき8つの要素