用作接口替代的内部类的示例

我被告知,这引起了我对这个话题的好奇心:

Java gui类可以实现数百个Listener和Callbacks,许多书籍教你在gui类中实现所有这些接口。 或者,这些方面可以在内部类中实现,因此该侦听器调用的方法不会混淆。

我想知道如何在ActionScript中执行此操作,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使用事件处理程序的闭包