我已經在我的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」接口。
謝謝!
沒有什麼個人的,但我簡單的頭腦被所有這些字母湯困惑:)我認爲如果你顯示變量名有意義,你的解釋會更清楚。去給它另一個讀過... –
@Sunil D.謝謝你的建議。我非常感激。事實上,我試圖用一種有意義的方式命名它們,「B」表示Base接口,「C」表示Consumer接口,「D」表示Derived接口。他們只是把第一個字母作爲他們的ID。那麼,也許我沒有明確指出這一點。 – xnslong