2011-12-01 141 views
1

我想從另一個子類(Wedge.as)調用一個子類(Circle.as)中的函數。 Circle.as由文檔類(Tree.as)實例化,Wedge.as由Circle.as實例化。我該怎麼做呢?這是我的代碼:在另一個子類中的一個子類中閃存as3調用函數

Tree.as

package com.treediagram 
{ 
    public class Tree extends MovieClip 
    { 
    var firstCircle:Circle = new Circle(); 
    addChild(firstCircle); 
    } 
} 

Circle.as:

package com.treediagram 
{ 
    public class Circle extends MovieClip 
    { 
    private var wedge:Wedge; 
    public function Circle() 
    { 
     var circleHolder:MovieClip = new MovieClip(); 
     var circleClip:MovieClip = new MovieClip(); 
     circleClip.addEventListener(MouseEvent.CLICK,circleClickedEvent); 
    } 

    private function circleClickedEvent(e:MouseEvent):void 
    { 
     var wedgeHolder:MovieClip = new MovieClip(); 
    circleHolderRef.addChildAt(wedgeHolder,1); 
     var wedge:Wedge = new Wedge(wedgeHolderRef); 
    wedge.addEventListener(MouseEvent.CLICK,wedgeClickEvent); 
    } 



    private function wedgeClickEvent(e.target){ 
     trace ('click'); //NOT WORKING 
    } 
    } 
} 

Wedge.as

package com.treediagram 
{ 
    public class Wedge extends MovieClip 
    { 
    public function Wedge(wedgeHolderRef) 
    { 
     var wedgeClip:MovieClip = new MovieClip(); 
     wedgeClip.addEventListener(Event.ADDED_TO_STAGE, wedgeAddedEvent); 
     wedgeHolderRef.addChild(wedgeClip); 
    } 
    } 
} 

我看到了類似的問題,這在這裏:

How to call a function in a Class from another Class?

但它有點難以遵循,因爲它涉及到我的問題。其中一個解決方案奏效,但被評論爲不良形式,另一個解決方案無法正常工作,所以我想確保我的代碼能夠正確構建。

回答

2

通常,父類可以瞭解其子女,但不是相反。如果你不遵循這個原則,你最終會創建Circular dependencies,並且代碼緊密耦合,難以維護。關鍵在於防止孩子直接調用父母的方法。

一個解決方案是使用event-based communication。當子類中發生某些事情時,它會觸發父類可能選擇處理或不處理的事件。

例如:

public function Circle() 
{ 
    var wedge:Wedge = new Wedge(); 
    wedge.addEventListener(MouseEvent.CLICK, onWedgeClick); 
} 
private function onWedgeClick(e:MouseEvent) { 
    deactiveCircle(); 
} 
+0

您可能希望從Wedge類派遣自定義事件並進行捕獲。因此,在「handleWedgeClick」函數中,只需調用「this.dispatchEvent(new Event(」wedgeClick「));」然後聽取「wedgeClick」而不是MouseEvent.CLICK。 – Glenn

+0

@panupan - 問題是我需要聽取楔形對象內部的東西的點擊,而不是楔形本身。 – mheavers

+1

你好,在這種情況下,你需要使用事件冒泡。這允許事件實際上通過視圖層級「冒泡」。這是Responder Chain設計模式的一個實現,其中消息沿着鏈傳遞(在本例中爲視圖層次結構),爲每個對象在傳遞消息之前處理它提供機會。看看這個簡單的例子得到一個想法:http://blog.152.org/2009/11/flash-actionscript-3-event-bubbling.html – panupan

1

只需在Circle類中將wedgeClickHandler附加到楔形成員上 - 它將會收到MouseEvent就好了,它可以直接訪問私有函數。

+0

如果我做到這一點 - 一個,我真的不喜歡與楔事情在圈內類,和兩個 - 這不是我的挖起杆識別點擊動作。實際的類會生成一個剪輯,並將該剪輯添加到該圓 - 所以我假設我需要在該類內部引用該剪輯。但我不知道如何做到這一點。 – mheavers

+0

@mheavers,你的'Circle'類正在實例化一個'Wedge',它負責管理'Wedge'實例;將Wedge綁定到一個Circle可以更好。如果你想變得更復雜,接口和工廠是可能的解決方案;但這可能會在你的案例中矯枉過正? – Peter

+0

其中之一 - 您對楔形內的事件做出反應,但是您正在停用* circle *。這樣做是完全正確的,因爲楔子不需要知道任何關於其父類的事情,楔子也是圈子的一員。兩個 - 你的圈子應該有一個'私人變量楔子:楔子',否則它將被丟棄。另一方面,如果使用事件偵聽器,楔形不需要引用圓。 – weltraumpirat

0

,因爲它的可設置爲private因爲你Wedge對象需要有要在其調用方法Circle對象的引用,你不能叫Circle.deactivateCircle()

+0

你實際上並沒有使用Singleton,這很好,因爲它實際上是一種反模式http://misko.hevery.com/2008/11/21/clean-code-talks-global-state-and-singletons/ –