问题描述
|
有人告诉我,这引起了我对此话题的好奇:
Java gui类可以实现数百个侦听器和回调,并且许多书籍都教您在gui类中实现所有这些接口。另外,这些方面也可以在内部类中实现,这样,侦听器调用的方法就不会混淆。
我想知道如何在ActionScript中执行此操作,该脚本没有内部类,但是具有私有类。但是,我认为我还没有完全意识到内部类的含义,因此我只是想把我的头放在我会用它们根据它们的用法来组织一个类的方法的情况下。
请显示一个示例(如果可能的话),该示例在ActionScript中的外观,否则为Java。
解决方法
在Java中看起来像这样:
new JButton().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// code that will be performed on any action on this component
}
};
这里的ActionListener
是一个接口,通过调用new ActionListener() {/*interfaces method implementations goes here*/};
,您正在创建匿名类(由于没有名称,所以它是匿名的)-该接口的实现。
或者您可以像这样创建内部类:
class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
// code that will be performed on any action on this component
}
};
然后像这样使用它:
new JButton().addActionListener(new MyActionListener());
此外,您可以将侦听器声明为顶级或静态内部类。但是有时使用匿名内部类非常有用,因为它使您几乎可以在声明侦听器正在监听的组件的位置处实现侦听器。显然,如果侦听器方法代码很长,则不是一个好主意。然后最好将其移动到非匿名内部或静态嵌套或顶级类中。
通常,内部类是非静态类,它们以某种方式驻留在顶级类的主体内。在这里,您可以看到Java中的示例:
//File TopClass.java
class TopClass {
class InnerClass {
}
static class StaticNestedClass {
}
interface Fooable {
}
public void foo() {
new Fooable(){}; //anonymous class
class LocalClass {
}
}
public static void main(String... args) {
new TopClass();
}
}
,Gasan给出了一个很好的示例,说明如何将内部类通常用于Java GUI中的回调。但是在AS3中,您通常不会这样做,因为AS3事件侦听器是函数引用,而不是接口。在这方面,AS3与JavaScript的共同点比Java多。
在AS3中(与JavaScript一样),可以代替匿名内部类回调来创建函数闭包。
编辑:我在这里找到了一个引用,可以节省很多输入:
ActionScript 3.0使用事件处理程序的闭包