AS3:为什么在Event正常工作时使用MouseEvent作为函数Param?

时间:2011-04-08 15:32:57

标签: flash actionscript-3

我一直在努力改进我的编程习惯,而我的这个习惯让我觉得这可能不是最好的方法。处理MouseEvent函数调用时,我倾向于使用Event而不是MouseEvent的参数。

示例:

mc.addEventListener(MouseEvent.CLICK, handleClick);

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

MouseEvent类中Event内部是否有某些功能或属性可能会使MouseEvent更多的必要性?我能够独立思考的唯一原因是保持你的事件/函数参数强类型。

3 个答案:

答案 0 :(得分: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);
 }

一般来说,你希望你的监听器参数类型只是必要的通用,这样如果用错误类型的事件调用你的函数,它就会以明显的方式失败。

您的示例有效,因为currentTarget是Event基类的属性。但是没有什么可以阻止你的句柄从接收和响应IOErrorEvent或KeyboardEvent,并做一些你不会没有失败的事情(例如,如果你不小心把它设置为听一些除了MouseEvent之外的东西,你不会故意这样做,但如果您复制粘贴addEventListener代码行并更改事件类型但忘记更改处理函数,则可能会发生......这些事情确实发生了。

答案 1 :(得分:2)

这是Event

提供的信息列表
  • 类型:字符串
  • 气泡:布尔
  • 或取消:布尔

这是MouseEvent

提供的信息列表
  • 类型:字符串
  • 气泡:布尔
  • 或取消:布尔
  • localX:编号
  • localY:编号
  • 则relatedObject:InteractiveObject
  • 中ctrlKey:布尔
  • 方altKey:布尔
  • Shift键,:布尔
  • 的buttonDown:布尔
  • 增量:INT
  • command键:布尔
  • CONTROLKEY:布尔
  • 的clickCount:INT

如您所见, MouseEvent 包含的事件比通用的 Event 对象更具体。

以下内容将失败:

private function mouseEventHandler(evt:Event):void
{
trace(evt.localX);
}

答案 2 :(得分:0)

MouseEvent对象包含Event对象之外的信息。也就是说,MouseEvent继承自Event。在调用事件监听器的意义上使用Event工作,但如果你需要事件的鼠标特定属性,那么只使用基类将无法工作。

换句话说,这个问题的答案是“是”:

  

MouseEvent中是否有一些功能或属性在Event类中不可用,这会使MouseEvent变得更加必要?

Adam的答案为您提供了一个示例场景。