2014-02-27 23 views
0

AS3 Proxy類擴展了Object並公開了可以重寫的方法,以通用方式處理對象的添加/刪除和獲取/設置屬性。Proxy類可以在AS3中的現有類中使用嗎?

似乎現有對象(如MovieClip,Sprite等)不會從Proxy類繼承,因此似乎排除了向現有顯示對象類添加此類功能的可能性。

我已經創建了一個名爲GUIControl一個基本展示對象類,從MovieClip繼承的佈局框架,我希望通過覆蓋Proxy類的setProperty方法將數據綁定功能添加到它,所以我可以處理財產分配使用單個處理程序可使所有屬性默認作爲綁定源。

是否有一些方法來利用現有的類上的代理類的功能,或者我堅持從頭開始構建基於代理的類?

回答

0

您可以創建MovieClip的包裝類並在包裝上設置屬性。您應該覆蓋Proxy中的其他功能並調用MovieClip上的相關功能。

下面是一個例子

import flash.display.MovieClip; 
import flash.utils.Proxy; 
import flash.utils.flash_proxy; 

public class MovieClipWrapper extends Proxy 
{ 
    public function MovieClipWrapper(target:MovieClip) 
    { 
     super(); 

     _target = target; 
    } 

    private var _target:MovieClip; 

    override flash_proxy function setProperty(name:*, value:*):void 
    { 
     //set data on target movieClip, or call the notify functions 
    } 

} 
+0

這確實不能解決問題,因爲Proxy仍未應用於MovieClip實例。此包裝程序無法添加到顯示列表中,並且如果將包裝的MovieClip添加到顯示列表中,則沒有任何方法或事件處理程序將通過此包裝程序,因爲它完全脫離了繼承鏈。 – Triynko

+0

您不需要將包裝器添加到顯示列表中。包裝器用於傳輸數據。如果你想使用動畫片段,你可以在Wrapper中添加一個函數來獲取MovieClip。 – Pan

+0

我知道我不需要*,我只是說包裝*不能*被添加到顯示列表中。因此,實際的顯示對象將不可避免地被顯示列表以MovieClipWrapper不可見的方式操作,因此在設置屬性時應該運行的邏輯將不會運行。例如,在佈局框架中,更改父元素的寬度將改變停靠的子元素的寬度,並且因爲此包裝不在繼承鏈中,所以它無法檢測包裝對象上的屬性更改。此外,您不需要Proxy來編寫像這樣的包裝。 – Triynko

0

不,它不能在現有的類使用。最糟糕的部分是在任何顯示列表類中排除使用代理。無法更改顯示列表類上的屬性,並讓Proxy類攔截並處理設置或獲取此類屬性值。代理僅作爲新類的基類(理想的是動態類),您可以在設置/撤銷/刪除屬性時攔截並運行邏輯。

另外,Proxy對於試圖包裝類似Dictionary類的東西沒有用處,因爲Proxy的接口方法完全依賴QName和String類型的鍵,這使得無法枚舉使用對象的Dictionary值實例作爲鍵...某些字典支持與關聯數組或常規對象不同。

相關問題