我在鼠标按下时触发了一个方法:
private function setGender(e:MouseEvent):void
{
check.visible = true;
check.x = e.target.x;
check.y = e.target.y;
}
在键盘事件上触发的另一个方法共享相同的方法体(因此,它需要一个键盘事件作为参数)。处理这样的情况的最佳方法是哪种?我想只有一种方法!
一种方法是创建一个由两个事件处理程序调用的新方法(即使我需要使用e.target,它可以根据事件的类型和其他变量进行更改,所以我最终应该创建一个将e.target作为参数的方法)。这创造了三种方法......
是否可以更改例如具有MouseEvent和KeyboardEvent父级的e:MouseEvent?会有用吗?有什么缺点吗?这完全错了吗?
答案 0 :(得分:0)
您可以为两者使用相同的事件处理程序,但是将参数类型指定为Event(这是您定位的两种事件类型的基类。)请注意,如果您使用的是任何内容,这当然不起作用是特定于其他处理程序中的KeyboardEvent(您没有显示),但如果它们真的相同,它将起作用。
private function setGender(e : Event) : void
{
check.visible = true;
check.x = e.target.x;
check.y = e.target.y
}
此事件侦听器可用于由显示对象(或具有x
和y
属性的任何对象)调度的任何事件。
答案 1 :(得分:0)
你的最后一句话是在正确的轨道上,但不太正确。您真正想要的是层次结构中更高的事件类型,而不是MouseEvent
和KeyboardEvent
。这意味着Event
实际上就是您想要使用的。
private function setGender(e:Event):void
{
check.visible = true;
check.x = e.target.x;
check.y = e.target.y;
}
作为基础Event
拥有您在两个事件中寻找的唯一属性,这应该有效。但是,如果要使用其他属性,即使是MouseEvent和KeyboardEvent 共享的属性,只有在基本Event类中存在时才能使用它。但是,如果您最终想要使用事件的其他属性,也可以尝试转换事件。
private function setGender(e:Event):void
{
if (e is MouseEvent)
{
//handle mouse
}
else
{
//handle keyboard
}
check.visible = true;
check.x = e.target.x;
check.y = e.target.y;
}
答案 2 :(得分:0)
就我个人而言,如果您按照最初的建议使用extract method重构模式,我认为您的代码会更清晰,更能表达您的意图:
private function onMouseEvent(event : MouseEvent) : void {
updateGender(event.target);
}
private function onKeyboardEvent(event : KeyboardEvent) : void {
updateGender(event.target); // are you sure event.target is the intended
// DisplayObject on a KeyboardEvent?
}
private function updateGender(target : DisplayObject) : void {
// update the DisplayList here.
}
通过这种方式,您可以在触发器(MouseEvent或KeyboardEvent)与反应(updateGender()
中的代码)之间提供解耦。