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

Actionscript 3 在不同的处理程序中处理相同的方法体,actionscript-3,Actionscript 3,我在鼠标按下时启动了一个方法: private function setGender(e:MouseEvent):void { check.visible = true; check.x = e.target.x; check.y = e.target.y; } 同一个方法体由在键盘事件上激发的另一个方法共享,因此,它将键盘事件作为参数。处理这种情况的最好方法是什么?我想只有一种方法 一种方

我在鼠标按下时启动了一个方法:

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?这样行吗?有什么缺点吗?这是完全错误的吗?

您可以对这两种事件处理程序使用相同的事件处理程序,但将参数类型指定为event,它是您针对的两种事件类型的基类。请注意,如果您在另一个处理程序中使用特定于KeyboardEvent的任何内容,而您没有显示该处理程序,那么这当然不起作用,但如果它们确实相同,则会起作用

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

此事件侦听器可用于显示对象或具有x和y属性的任何对象调度的任何事件

你的最后一句话是正确的,但不完全正确。实际上,您需要的是一种在层次结构中高于MouseeEvent和KeyboardEvent的事件类型。这意味着事件实际上就是您想要使用的

private function setGender(e:Event):void
        {
            check.visible = true;
            check.x = e.target.x;
            check.y = e.target.y;
        }
由于基本事件在两个事件中都有您要查找的唯一属性,因此这应该可以工作。但是,如果要使用不同的属性,即使是MouseeEvent和KeyboardEvent共享的属性,则只能在基本事件类中存在该属性时使用它。但是,如果最终希望使用事件的其他属性,也可以尝试强制转换事件

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;
        }

就我个人而言,我认为如果您像最初建议的那样使用重构模式,您的代码会更干净,更好地表达您的意图:

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.
}

通过这种方式,您可以在鼠标事件或键盘事件的触发器与updateGender中代码的反应之间实现解耦。

这是一种常见做法还是我发明了一些新的但危险的东西-不,这是的标准用法。好的,这正是我想要的。事实上,它添加了另一个方法,如果在一个程序中有很多类似的情况,那么最终可能会得到很多代码。不要为KeyboardEvent的event.target担心,但感谢您指出所有这些。我更喜欢这个答案,而不是被接受的答案。当你开始检查e是否为MouseEvent时,你应该三思而后行。另一方面,这种解决方案违反了“不要重复你自己”的枯燥规则。我认为,在AS事件系统中,你总是怀疑你想要违反哪条规则,即干法还是分离关注点。这就是为什么我创建了一个小程序来处理这个问题。它消除了对这些处理程序的需要。这是一个正在进行的工作,没有任何文档,但它是可用的。[/end selfpromotion]自我提升没有问题,即使我将在文档准备好后测试您的库:-无论如何,在这种情况下,由于我的方法的主体非常庞大,并且没有办法更改它们,我宁愿不违反“DRY”规则。@RIAstar我不确定上面的代码片段如何违反DRY?如果你提到我给updateGender打了两次电话,那么我担心你是想让事情变得有点脱水@乔尼里夫斯:-好吧,你可能在这一点上是对的,但这个盒子太小了,无法恰当地表达我的悲痛。它还涉及到这样一个事实,即类的大纲中充斥着处理函数。他们的名字没有说明他们在做什么,只是在他们做的时候。他们的论点90%都被忽略。e、 通常当你点击一个按钮时,你不需要任何额外的信息。为了正确地执行,我必须在SubmitButtonClickeEvent:MouseeEvent:void{submit;}上编写私有函数;同样的图案一次又一次,因此是干的。