0

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」インターフェイス。

ありがとうございました!

4

1 に答える 1