2011-05-03 133 views
0

假設在文檔類對象不能在顯示列表上訪問根或在顯示列表上添加的任何對象?

public class Test extends MovieClip 
{ 
    public function Test() 
    { 
     var object1:ClassA = new ClassA(); 
     //addChild(object1); 
     object1.accessRoot(); 
    } 
} 

public class A extends MovieClip 
{ 
    public function accessRoot() 
    { 
     var mc : MovieClip = root as MovieClip; 
     mc.box.visible = false; 
    } 
} 

現在盒被放置在舞臺。但是當類A被添加到測試類時,它將起作用,並且在測試構造函數中未添加類A的對象時,根變爲不可訪問。有什麼辦法可以使不在display-list上的對象可以訪問根或顯示列表對象嗎?

+0

什麼是你的情況下的'根'?它是一個MainTimeline對象還是默認的類對象(比如[object Main])?你想如何使用'root'? – Corey 2011-05-03 21:18:00

+0

在我的情況下,它是一個MainTimeline,或者它可以是默認類。 – 2011-05-04 09:09:09

回答

3

我不會推薦讓你的類在根或舞臺上擺弄,它更好地派發事件並進行適當的封裝。

哈克的方式:

public class A extends MovieClip 
{ 
    private var _root:MovieClip;   

    public function A(root:MovieClip) 
    { 
     _root = root; 
    } 

    public function accessRoot() 
    { 
     _root.box.visible = false; 
    } 
} 

有道:

public class A extends MovieClip 
{ 

    public static const ACCESS_ROOT:String = "access_root"; 

    public function accessRoot() 
    { 
     dispatchEvent(new Event(ACCESS_ROOT)); 
    } 
} 

// in your document class 

var myA:A = new A(); 
myA.addEventListener(A.ACCESS_ROOT, handleAccessRoot); 

public function handleAccessRoot(e:Event):void{ 
    box.visible = false; 
} 
+0

在hacky方式中,傳遞根引用違反封裝? hacky的缺點是什麼? – 2011-05-04 11:40:19

+0

當你的對象訪問它們的根級別時,它們擺弄着它們通常不應該訪問的東西,這意味着它們可以觸及各種事物。除了讓你做不適合的事情之外,它沒有任何直接的缺點。 – grapefrukt 2011-05-04 12:53:49

+0

handleAccessRoot從來沒有觸發..我需要實現一個接口到ProperClass – 2011-05-05 13:46:04

0

我通常創造一種保存到文檔類的引用基類的 - 或「主」類。我從這裏創建的任何應該需要引用Main中定義的任何內容的元素都會擴展Element。例如:

主類(或文檔類):

public class Main extends MovieClip 
{ 
    /** 
    * Constructor 
    */ 
    public function Main() 
    { 
     var obj:MyElement = new MyElement(); 
     obj.main = this; 
     // stage will be outputted 
    } 
} 

元素 - 其存儲參照主類。 它還包含一個init()函數,我通常通過覆蓋它來代替構造函數。

public class Element extends MovieClip 
{ 
    private var _main:Test; 

    public function set main(m:Main):void 
    { 
     _main = m; 
     init(); 
    } 

    /** 
    * Called when _main is defined 
    */ 
    protected function init():void 
    { 
     // override me 
    } 

    public function get main():Main{ return _main; } 
} 

而且這裏是你將如何使用元素作爲基類的類:

public class ClassA extends Element 
{ 
    /** 
    * Override init rather than using a constructor 
    */ 
    override protected function init():void 
    { 
     trace(main.stage); 
    } 
} 

唯一真正要注意的是,當然,你有當你創建一個設置_main屬性目的。 (如Main的第9行所示)。