在不同的处理程序中处理相同的方法体

时间:2011-08-23 12:28:30

标签: actionscript-3

我在鼠标按下时触发了一个方法:

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?会有用吗?有什么缺点吗?这完全错了吗?

3 个答案:

答案 0 :(得分:0)

您可以为两者使用相同的事件处理程序,但是将参数类型指定为Event(这是您定位的两种事件类型的基类。)请注意,如果您使用的是任何内容,这当然不起作用是特定于其他处理程序中的KeyboardEvent(您没有显示),但如果它们真的相同,它将起作用。

private function setGender(e : Event) : void
{
    check.visible = true;
    check.x = e.target.x;
    check.y = e.target.y
}

此事件侦听器可用于由显示对象(或具有xy属性的任何对象)调度的任何事件。

答案 1 :(得分:0)

你的最后一句话是在正确的轨道上,但不太正确。您真正想要的是层次结构中更高的事件类型,而不是MouseEventKeyboardEvent。这意味着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()中的代码)之间提供解耦。