我在我的 flex 项目中定义了 3 个接口,“B”、“C”和“D”。“D”接口扩展“B”接口,“C”接口是“B”类型实例的消费者。之后,我定义了 2 个模块,M1 和 M2。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
}
}
然后我定义了 2 个模块加载器(mld1 和 mld2)来在主应用程序中加载 M1 和 M2(通过设置 url)。在 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”接口。
谢谢!