2013-06-05 89 views
0

我已經在我的flex項目「B」,「C」和「D」中定義了3個接口。 「D」接口擴展「B」接口,「C」接口是「B」型實例的使用者。之後,我定義了2個模塊,M1和M2。 M1實現「D」接口,M2實現「C」接口。 M2的公共職能如下。通過接口在Flex模塊之間進行通信

/* 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 

然而,當它調用M2.consume(B):在第3行void函數,「如果」判定在消耗功能(線1)總是會失敗和「如果」的體結構總是會被跳過。但如果我在第3行之前將「M2」模塊中第1行所示的類型確定行添加到主應用程序,則第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

@Sunil D.謝謝你的建議。我非常感激。事實上,我試圖用一種有意義的方式命名它們,「B」表示Base接口,「C」表示Consumer接口,「D」表示Derived接口。他們只是把第一個字母作爲他們的ID。那麼,也許我沒有明確指出這一點。 – xnslong

回答

0

它很難遵循你所寫的一切,所以可能我錯過了一些東西,但是如果你沒有將D導入到主應用程序中,它將不會被編譯到生成的SWF中。這就是爲什麼主應用程序不會意識到D.

+0

感謝您的回答。事實上,我期望主應用程序不會意識到D,並且主應用程序加載的2個模塊會意識到它。主要應用程序關心的是它應該得到一個B型對象和一個可以使用B型對象的C型消費者,然後它將使用C.consume(B)函數將B對象交給C型消費者。正如我們所知,我們可以有一個接口的許多實現。主應用程序不會關心B型對象是否也是D型實例。誰應該關心它是具體的模塊。 – xnslong

+0

長度限制!那麼,我希望主應用程序是任何B實例和任何C實例的所有實現的通用應用程序。如果只有我加載了任何2個模塊(分別實現了B&C接口),並設置與消費函數的關係,那麼他們將能夠正確運行。所以主應用程序不應該提及D接口和具體實現M1和M2,當然,它們應該被編譯到主應用程序的結果SWF中。否則,主應用程序將不如預期的一般。 – xnslong