2017-09-07 100 views
1

將子類作爲參數傳遞給另一個函數是一種很好的做法,因爲我希望修改子類的屬性。Actionscript 3:將類作爲參數傳遞

我特別想對類設置爲

alpha = 0.5; 

我通常所做的子類主類和訪問它的方式的私有財產。但是,我想知道這是一種更好還是更壞的方式?

像這樣:

 var d:DElem = new DElem(text);   
     addChild(d); 
     d.addEventListener(MouseEvent.CLICK, Proxy.add(this, click, d)); 


     private function click(event:MouseEvent, elem:DElem):void { 
      Animate.fadeOutIn(elem); 
     } 
+1

你可以添加一個超級簡單的例子來你的問題,其中將包含你想使用的類結構 –

+0

我添加了一個例子。 – seventeen

+1

在你的例子中,你並不需要將'elem'傳遞給函數。你可以從'event.currentTarget'或'event.target'獲取它。 –

回答

2

看着你的代碼,我一定會推薦。除非您共享的代碼只運行一次,否則您很可能會發生內存泄漏。

將事件偵聽器添加到對象時,該事件偵聽器會將該對象保留在內存中,即使它已準備好進行垃圾回收(不再使用)。當你用一個匿名函數添加一個事件監聽器(這大概是從Proxy.add返回的,那麼你就沒有簡單的方法去除事件監聽器了,做d.removeEventListener(MouseEvent.CLICK, Proxy.add(this, click, d))不會工作,因爲Proxy.add每次都返回一個新的/不同的函數因爲即使代碼方面它與添加偵聽器時相同,因爲返回的對象/函數是不同的,它不會實際刪除偵聽器。

您可以將true傳遞給弱標誌(第5個參數)當你添加你的聽衆時:

d.addEventListener(MouseEvent.CLICK, Proxy.add(this, click, d), false, 0, true); 

這告訴FlashPlayer忽略偵聽器時,找出哪些對象fr記憶中的ee。雖然這會減少你的內存泄漏的可能性,但它仍然不是一個很乾淨的方式。儘管總是使用弱標誌是一種很好的做法,或者在不再需要時總是明確地刪除聽衆。

作爲評價和對方的回答提到了,你其實並不需要使用您的代理類,下面將完成你想要什麼:

d.addEventListener(MouseEvent.CLICK, click, false, 0, true); 

private function click(event:MouseEvent):void { 
    Animate.fadeOutIn(event.currentTarget as Sprite); 
    //event.currentTarget is a reference to the Object that you attached the listener to 
    //event.target is the object that actually dispatched the event, which could be the same as event.currentTarget, or a child of it 
} 
+0

謝謝,這是一個很好的解釋。 – seventeen

1

是的,這是很好的做法,根據您的應用程序體系結構。 在許多情況下,您可以將類作爲方法參數發送。但是看看你的代碼,你不是發送一個Class作爲參數,而是一個DElem Class的實例,這也是一個很好的習慣。 某些事件帶有它們的目標(即鼠標事件),您可以通過event.target或event.currentTarget訪問它們。儘管爲了搶佔編譯時錯誤,您可能會發現將方法參數類型化爲正確的目標會更方便。