2011-04-08 12 views
5

Siempre trato de mejorar mis prácticas de programación y este hábito mío me ha hecho pensar que tal vez no sea el mejor enfoque. Al manejar las llamadas a la función MouseEvent tengo una tendencia a usar Event sobre MouseEvent en los parámetros.AS3: ¿Por qué usar MouseEvent como función Param cuando el evento funciona bien?

Ejemplo:

mc.addEventListener(MouseEvent.CLICK, handleClick); 

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

¿Hay algunas funciones o propiedades dentro de MouseEvent disponible en la clase Event que haría uso de MouseEvent más de una necesidad? La única razón por la que puedo pensar por mi cuenta es mantener tus params de eventos/funciones fuertemente tipados.

Respuesta

11

Si no escribe el parámetro como MouseEvent, tendrá que convertirlo como MouseEvent para acceder a las propiedades que son específicas de la subclase MouseEvent. Por ejemplo:

esto no funcionará:

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

pero esto:

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

Sin embargo por lo que será este (no se recomienda, sin embargo, ver a continuación):

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

En general, desea que su tipo de parámetro de oyente sea tan general como sea necesario, de modo que si su función se llama w Con el tipo de evento equivocado, falla de una manera obvia.

Su ejemplo funciona porque currentTarget es una propiedad de la clase base del evento. Pero no hay nada que detenga su handleClick de recibir y responder a un evento IOErrorEvent o KeyboardEvent, y hacer algo que no espera sin fallar (por ejemplo, si lo configura accidentalmente para escuchar algo que no sea un evento MouseEvent, que no haría deliberadamente , pero podría suceder si copie y pegue la línea de código addEventListener y cambie el tipo de evento, pero olvide cambiar la función del controlador ... estas cosas sí suceden).

+0

excelente, gracias por el ejemplo y la explicación. –

+0

¡Ningún problema! Probablemente también debería haber notado que otra razón por la que es útil ser lo más específico posible con el tipado, es que el compilador AS3 no realiza ninguna comprobación de tipo en tiempo de compilación de los argumentos de su controlador de eventos. Esto es cierto también para cualquier caso en el que pase una referencia de función (como para una devolución de llamada). Si tiene una discrepancia de recuento de tipo o argumento, será una ruptura de tiempo de ejecución. Pero el peor de los casos sigue siendo cuando no falla, pero debería ... Además, cuando utilice el tipo correcto "MouseEvent", se beneficiará del autocompletado de su editor de código para todas las propiedades disponibles. –

+0

Además, si bien su pregunta es específicamente sobre Event y su subclase MouseEvent, la pregunta subyacente más general es: ¿cuándo debería usar una referencia de clase base para una instancia de una (o más) de sus subclases, y la respuesta a esa pregunta es no es rápido, sino más bien una explicación del polimorfismo en general, de un libro o la wikipedia: http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming –

0

Los objetos MouseEvent contienen información más allá de los objetos Event. Es decir, MouseEvent hereda de Event. El uso de Event funciona en el sentido de que se llamará al detector de eventos, pero si necesita propiedades específicas del mouse del evento, entonces el uso de la clase base no funcionará.

En otras palabras, la respuesta a esta pregunta es "sí":

¿Hay algunas funciones o propiedades dentro de MouseEvent disponible en la clase de sucesos que haría uso de MouseEvent más de una necesidad?

La respuesta de Adam le da un escenario de ejemplo.

2

Esta es una lista de la información disponible a partir de una Event:

  • Tipo: Cadena
  • bubbles: Boolean
  • cancelable: booleanas

Esta es una lista de la información disponible a partir de a MouseEvent:

  • tipo: String
  • burbujas: Boolean
  • cancelable: Boolean
  • localX: Número
  • localY: Número
  • relatedObject: InteractiveObject
  • ctrlKey: Boolean
  • altKey: Boolean
  • shiftKey: Boolean
  • buttonDown: Boolean
  • delta: int
  • commandKey: Boolean
  • controlKey: Boolean
  • clickCount: int

como se puede ver, el MouseEvent contiene datos mucho más específico para el evento que un genérico Evento objeto.

algo como lo siguiente fallará:

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