我想知道最佳做法是什么。这是相当无关紧要的,但我对人们的意见感兴趣。
我们有两个类 - TitleBar和TemplateMain。 TitleBar是屏幕顶部的一个栏,显示项目标题和几个按钮(设置,打印,全屏等),TemplateMain需要监听这些按钮才能运行相关功能。目前,模板侦听click mouseevent,然后使用switch语句获取事件的初始目标,例如:
protected function onTitleBarClick(e:MouseEvent):void {
switch (e.target){
case (titleBar.settingsButton):
addSettings();
break;
// etc..
}
}
是否有任何优势或者是否可以将其移植到自定义事件系统中,或者扩展本机Event类,或者甚至是as3signals,以便标题栏本身具有click监听器,然后调度TemplateMain选择的事件和那么行动呢?我可以看到的一个负面影响是,与鼠标点击监听器一起,我最终会有另外六个自定义事件的监听器。
就像我说的那样,也许没关系,但我想知道其他人如何处理这种非常普遍的情况。
答案 0 :(得分:1)
我建议采用简单直接的方法将TemplateMain处理程序直接附加到各个按钮。如果您不想在两者之间建立紧密的关系,那么请使用单独的代理或其他东西来注册事件处理程序。
class TemplateMain {
function addSettings(...) { }
function doSomethingElse(...) { }
function doAnotherThing(...) { }
}
class Broker {
function registerHandler() {
titleBar.settingsButton.addEventHandler("click", templateMain.addSettings);
titleBar.somethingElseButton.addEventHandler("click", templateMain.doSomethingElse);
titleBar.anotherThingButton.addEventHandler("click", templateMain.doAnotherThing);
}
}
答案 1 :(得分:0)
您可以使用自定义事件或常规事件,但实际上并不需要六个不同的侦听器。只需将事件参数转换为泛型,然后测试事件的“类型”。例如:
protected function onTitleBarClick(event:Event = null) : void {
if (event is MouseEvent && event.type is MouseEvent.CLICK) {
if (event.target is titleBar.settingsButton) {
// statements
}
if (event.target is titleBar.someOtherButton) {
// statements
}
}
if (event is MyCustomChangeEvent && event.type is MyCustomChangeEvent.SOME_TYPE) {
// statements, etc.
}
}
然而,通常情况下,最好分手处理程序而不是尝试使用一个综合处理程序。
答案 2 :(得分:0)
我个人更喜欢尽可能接近“黑匣子”原则,其中一个组件需要尽可能少地了解另一个组件。
我会去定义TitleBar中的事件。当TemplateMain收到一个事件时,它不必知道事件的来源,它是什么以及如何对它作出反应。
这为您提供了几个选项,您可以使用调度程序对象,或者TitleBar本身可以作为调度程序,尽管我总是喜欢组件松散耦合。
在事件监听结束时,使用单个处理程序或许多函数将完全取决于函数的内容。我会去清楚&易读性。我没有看到为一个内衬创建函数的意义,在这种情况下我会赞成switch语句。
至于创建一些听众,我不认为这是一个问题,它允许你根据功能的生命轻松删除一个或另一个。