Flex プロジェクトで「B」、「C」、「D」の 3 つのインターフェイスを定義しました。「D」インターフェースは「B」インターフェースを拡張し、「C」インターフェースは「B」タイプのインスタンスのコンシューマーです。その後、M1 と M2 の 2 つのモジュールを定義しました。M1 は「D」インターフェースを実装し、M2 は「C」インターフェースを実装します。M2 は、次のような公開機能を持っています。
/* in the "M2" module */
// the stub is declared in the "C" interface.
public function consume(b:B):void{
if(b is D){ // line 1: type determination
// do something on the D interface
}
}
次に、メイン アプリケーションで (URL を設定して) M1 と M2 をロードする 2 つのモジュール ローダー (mld1 と mld2) を定義しました。そして、M1 と M2 の両方がロードされた後、M2 モジュールに実装されている「C.consume(B):void」関数を介して M2 に M1 を提供しようとしました。コードは以下のようなものです。
/* in the "main" application */
var m1:B = mld1.child as B; // line 2: cast type to B
var m2:C = mld2.child as C;
m2.consume(m1); // line 3: provide m1 instance for m2
ただし、3 行目の M2.consume(B):void 関数を呼び出すと、consume 関数 (1 行目) の if 判定は常に失敗し、if 構造体の本体は常にスキップされます。しかし、「M2」モジュールの 1 行目に示されているようなタイプ判別行をメイン・アプリケーションの 3 行目の前に追加すると、1 行目のタイプ判別は成功します。つまり、メイン アプリケーションの次のようなコードにより、1 行目の型判定を渡すことが可能になります。
/* in the "main" application: make type determination be line 3 */
var m1:B = mld1.child as B; // line 2: cast type to B
if(m1 is D) // just make a plain determination. nothing else.
;
var m2:C = mld2.child as C;
m2.consume(m1); // line 3: provide m1 instance for m2
または、型を D 型に直接キャストすると、同じ結果になります。
/* in the "main" application: make type cast before line 3 */
var m1:B = mld1.child as D; // line 2: after modified, cast type to D.
var m2:C = mld2.child as C;
m2.consume(m1); // line 3: provide m1 instance for m2
メインアプリケーションで「D」タイプについて言及した場合にのみ、1行目の判定が成功するのはなぜだろうか。メイン アプリケーションでの型決定または型キャストは、ターゲット オブジェクトに違いをもたらしますか? また、メイン アプリケーションが "B" インターフェイスとそのコンシューマ インターフェイス ("C" インターフェイス) だけを認識できるようにして、アプリケーションが "B" のサブ インターフェイスとクラスをサポートできるようにしたい場合は、どうすればよいでしょうか。および「C」インターフェイス。
ありがとうございました!