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

时间:2011-05-25 15:06:00

标签: java actionscript-3 oop interface inner-classes

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

  

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

我想知道如何在ActionScript中执行此操作,ActionScript没有内部类,但具有私有类。但是,我认为我并没有完全意识到内在的课程是什么,所以我只是试图围绕这样的情况,即我会用它们按照用法来组织课程的方法。

如果可能,请展示ActionScript中的外观示例,否则为Java。

2 个答案:

答案 0 :(得分:5)

在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();
    }
}

答案 1 :(得分:2)

Gasan提供了一个很好的例子,说明内部类通常如何用于Java GUI中的回调。但是在AS3中你通常不会这样做,因为AS3事件监听器是函数引用,而不是接口。在这方面,AS3与JavaScript的共同点多于Java。

你可以在AS3(就像用JavaScript一样)代替匿名内部类回调来创建函数闭包。

编辑:我在这里找到了一个引用,为我节省了很多打字:

ActionScript 3.0 using closures for event handlers