我在我的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函数时,消耗函数(第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”界面。
谢谢!
答案 0 :(得分:0)
很难跟踪你写的所有东西,所以可能是我错过了什么,但如果你没有将D导入主应用程序,它将不会被编译到生成的SWF中。这就是为什么主应用程序不会注意到D.