2011-08-20 48 views
2

任何人都可以提供或多或少的真實世界的例子,你可能想要實際使用這兩種Event類的方法嗎?Event.clone和Event.toString示例?

AS 3使我們覆蓋了擴展事件的任何自定義類中的這些方法,但我不知道爲什麼。

回答

3

toString - 我只用它來調試消息,但在這些情況下,如果您不覆蓋toString,那麼您將無法返回事件的字符串表示形式。考慮下面這個例子,其中單處理器用於捕獲各種事件類型:

function handleEvents(evt:*):void 
{ 
    //trace the event type and all parameters including extra parameters from custom events 
    trace(evt.toString()); 
} 

克隆 - 如果您需要重新派遣一個事件,事件類的clone方法將被調用。這將返回一個新的事件對象,並將目標重新分配給新的調度對象。問題是,如果您不覆蓋克隆方法,clone會從最後一個定義它的類中創建一個新的事件對象,而不是從您的自定義事件類中創建。當您捕獲重新分派的事件時,這很可能會導致類型錯誤。

+0

對。我想知道是否可以提供一個我可能希望重新分派事件的例子(大概來自事件處理程序內?)如果您不停止傳播,您爲什麼要重新分派相同的事件,而不是生成一個新的? –

+0

事件只能通過顯示樹起泡,所以如果你想要一個事件冒泡通過不在顯示樹上的類,你必須通過看起來像這樣的事件處理程序來僞裝它:'function eventHandler(event:Event): void {dispatchEvent(event); }' – shanethehat

-2

我從來沒有重寫過它們,並且每當它被保證時我總是使用自定義事件?

+1

你完全可以˚F你的程序,如果你沒有重載'clone',你就會把所有你的頭髮,你認識到這個問題之前,如果你」不清楚爲什麼它是必要的。 – TheDarkIn1978

2

增加shanethehat的toString解釋,如果不重寫toString和跟蹤事件,它會永遠打印的一般Event默認信息,因爲它是你的自定義事件是什麼子類。

覆蓋toString用於調試,所以它不是必要的,雖然它是鼓勵,特別是如果你分發你的API,與其他開發人員一起工作,或者只是想編寫乾淨,一致的代碼。

根據自定義事件中的屬性數量,可以創建一個switch語句,以便toString僅爲每種類型返回適當的事件屬性。下面是從我HistoryEvent類這樣的例子:

package com.mattie.events 
{ 
    //Imports 
    import flash.events.Event; 

    //Class 
    public class HistoryEvent extends Event 
    { 
     //Constants 
     public static const CHANGE:String = "change"; 
     public static const STATUS:String = "status"; 

     //Variables 
     public var action:String; 
     public var name:String; 
     public var data:Object; 
     public var undoable:Boolean; 
     public var undoableName:String; 
     public var redoable:Boolean; 
     public var redoableName:String; 
     public var index:uint; 

     //Constructor 
     public function HistoryEvent(type:String, action:String = null, name:String = null, data:Object = null, undoable:Boolean = false, undoableName:String = null, redoable:Boolean = false, redoableName:String = null, index:uint = 0) 
     { 
      super(type); 

      this.action = action; 
      this.name = name; 
      this.data = data; 
      this.undoable = undoable; 
      this.undoableName = undoableName; 
      this.redoable = redoable; 
      this.redoableName = redoableName; 
      this.index = index; 
     } 

     //Override clone 
     override public function clone():Event 
     { 
      return new HistoryEvent(type, action, name, data, undoable, undoableName, redoable, redoableName, index); 
     } 

     //Override toString 
     override public function toString():String 
     { 
      switch (type) 
      { 
       case CHANGE: return formatToString("HistoryEvent", "type", "action", "name", "data"); 
       case STATUS: return formatToString("HistoryEvent", "type", "undoable", "undoableName", "redoable", "redoableName", "index"); 
       default:  return null; 
      } 
     } 
    } 
} 
+0

太棒了,謝謝你的詳細示例。我應該發佈相關問題,因爲您的示例引發了我在創建各種事件類型具有不同相關參數的自定義事件類時所擔心的問題。從你的前。發佈一個STATUS事件我將不得不dispatchEvent(新的HistoryEvent(HistoryEvent.STATUS,null,null,null,true,'name'等...))。從API的角度來看,必須「跳過」前三個參數是一種痛苦。這是否需要第二種事件類型?那麼能夠針對單個自定義事件類定義多種類型有什麼意義? –