2011-04-08 58 views
5

我一直在努力改進我的編程實踐,而我的這一習慣讓我覺得這可能不是最好的方法。處理MouseEvent函數調用時,我傾向於在參數中使用Event而不是MouseEventAS3:事件工作正常時,爲什麼使用MouseEvent作爲函數Param?

例子:

mc.addEventListener(MouseEvent.CLICK, handleClick); 

private function handleClick(e:Event):void 
{ 
    trace(e.currentTarget.name + " was Clicked"); 
} 

是否存在的MouseEventEvent類不可用裏面的一些功能或屬性,這將使使用MouseEvent更多的必需品?我能獨自思考的唯一原因是讓你的事件/函數參數保持強類型。

回答

11

如果您沒有將參數輸入爲MouseEvent,則只需將其轉換爲MouseEvent即可訪問特定於MouseEvent子類的屬性。例如:

這是行不通的:

private function handleClick(e:Event):void 
{ 
    trace("altKey down: "+e.altKey); 
} 

但這會:

private function handleClick(e:MouseEvent):void 
{ 
    trace("altKey down: "+e.altKey); 
} 

但是這樣會這樣(不推薦,雖然,見下文):

private function handleClick(e:Event):void 
{ 
    trace("altKey down: "+MouseEvent(e).altKey); 
} 

一般來說,你希望你的監聽器參數類型只是必要的一般,所以如果你的函數被調用了w如果事件類型錯誤,它會以明顯的方式失敗。

您的示例可用,因爲currentTarget是Event基類的一個屬性。但是沒有什麼能夠阻止你的句柄單擊接收和響應IOErrorEvent或KeyboardEvent,並做一些你不期望的事情(例如,如果你不小心將它設置爲聽某個MouseEvent以外的東西,你不會故意這麼做,但是如果您複製粘貼addEventListener代碼行並更改事件類型,但忘記更改處理函數......會發生這些事情)。

+0

優秀的,謝謝你的舉例和說明。 – 2011-04-08 17:06:57

+0

沒問題!我應該也許已經注意到,另一個原因是,儘可能使用鍵入方式是有幫助的,因爲AS3編譯器不會對您的事件處理程序參數進行任何編譯時類型檢查。對於傳遞函數引用的任何情況(例如回調),情況也是如此。如果您的類型或參數計數不匹配,則會導致運行時損壞。但最糟糕的情況仍然是當它不失敗,但它應該...而且,當您使用正確的類型「MouseEvent」時,您將從您的代碼編輯器自動完成所有可用屬性中受益。 – 2011-04-08 22:41:06

+0

另外,儘管你的問題是關於Event及其子類MouseEvent的具體問題,但底層的更一般的問題是:何時應該爲其一個(或多個)子類的實例使用基類引用,並且該問題的答案是不是一個快速的,而是從一本書或維基百科的一般性多態性的解釋:http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming – 2011-04-08 22:47:56

0

MouseEvent對象包含超出Event對象所具有的信息。也就是說,MouseEvent從Event繼承。使用事件工作的意義是事件偵聽器將被調用,但如果您需要鼠標特定的事件屬性,那麼僅使用基類將無法工作。

換句話說,這個問題的答案是「是」:

有一些功能或屬性的MouseEvent Event類不可用的內部,這將使使用的MouseEvent更多的必需品?

Adam的回答爲您提供了一個示例場景。

2

這是可用的信息的列表從Event

  • 類型:字符串
  • 氣泡:布爾
  • 取消:布爾

這是購自的信息的列表a MouseEvent

  • 類型:字符串
  • 氣泡:布爾
  • 取消:布爾
  • localX:數
  • localY:數
  • 則relatedObject:InteractiveObject
  • 中ctrlKey:布爾
  • 方altKey:布爾
  • shiftKey:布爾型
  • buttonDown:布爾型
  • 三角洲:整數
  • command鍵:布爾
  • CONTROLKEY:布爾
  • 的clickCount:整數

,你可以看到,的MouseEvent包含更具體的數據,比一般的事件事件對象。

像下面這樣會失敗:

private function mouseEventHandler(evt:Event):void 
{ 
trace(evt.localX); 
} 
相關問題