Пример внутренних классов, используемых в качестве альтернативы интерфейсам - PullRequest
8 голосов
/ 25 мая 2011

То, что мне сказали, вызвало мое любопытство по этой теме:

Java-классы GUI могут реализовывать сотни Слушателей и Обратных вызовов, и многие книги учат вас реализовывать все эти интерфейсы в вашем GUI-классе. В качестве альтернативы эти аспекты могут быть реализованы во внутренних классах, поэтому методы, вызываемые этим слушателем, не путаются.

Я хотел бы знать, как это сделать в ActionScript, который не имеет внутренних классов, но имеет частные классы. Но я не думаю, что полностью осознаю, что такое внутренние классы, поэтому я просто пытаюсь обдумать ситуацию, в которой я бы использовал их для организации методов класса по их использованию.

Пожалуйста, покажите пример того, как это будет выглядеть в ActionScript, если это возможно, в противном случае Java.

Ответы [ 2 ]

5 голосов
/ 25 мая 2011

В 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();
    }
}
2 голосов
/ 25 мая 2011

Гасан дает отличный пример того, как внутренние классы обычно используются для обратных вызовов в графических интерфейсах Java.Но в AS3 вы обычно так не делаете, потому что слушатели событий AS3 являются ссылками на функции, а не интерфейсами.В этом отношении AS3 имеет больше общего с JavaScript, чем с Java.

То, что вы можете сделать в AS3 (как и в JavaScript) вместо анонимных обратных вызовов внутреннего класса, это создать замыкания функций.* РЕДАКТИРОВАТЬ: я нашел здесь ссылку, которая экономит мне много ввода:

ActionScript 3.0 с использованием замыканий для обработчиков событий

...