« クラス名のコンフリクト | メイン | のんの »

2004年9月21日

クラス名のコンフリクトなぞ解ける

ネコ温度計は完成です。まもなく公開。世界の天気に対応しました。
デバッグを続けているうちに「クラス名のコンフリクト」エラーがまたも出ました。この期に及んで・・・なんちゅうことだーとブルーに。

んが、じっくり考えて原因がわかりました。私が悪うございました。
簡単に書けば・・・・・・・・簡単には書けないなあ・・・・

クラス定義ファイル A.as
class A {
var bObj:B;
function A() {
bObj = new B(this); // クラスBのインスタンスを作る
}
function test() {
}
}

クラス定義ファイル B.as
class B {
var aObj:A;
function B(theObj) {
aObj = theObj;
}
function hisTest() {
aObj.test(); // Aクラスのメソッドを実行したい
}
}

A.asをコンパイルすると次のエラーになります。
「クラス名のコンフリクト:A.as: 行 1:このクラスの名前 'A' は、ロードされた別のクラスの名前 'A' とコンフリクトします。
class A{」
B.asをコンパイルしても同様です。
「クラス名のコンフリクト:B.as: 行 1:このクラスの名前 'B' は、ロードされた別のクラスの名前 'B' とコンフリクトします。
class B{」

これだけを見れば、こんなことせずにBクラスがAクラスを継承すればいいじゃんと思いますが、実際にはそうもいかないというケースでして・・・・
解決方法は2つです。その場しのぎというか、開発の後半でこういう状況に陥ってしまってもう大修正は危険だーというときには、クラスBの2行目を次のようにしてしまいます。aObjのデータ型を汎用Objectで逃げてしまうのです。

var aObj:Object;

本来なら、クラスAでクラスBを生成せずに次のようにクラスABを利用すれば解決します。
ま、簡単に書くとこういう話です。わかれば単純。
class AB{
function AB(){
var aObj:A = new A();
var bObj:B = new B(aObj);
}
}

投稿者 oshige : 2004年9月21日 22:57

コメント

コメントしてください

サイン・インを確認しました、 さん。コメントしてください。 (サイン・アウト)

(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


情報を登録する?