2011-05-25 19 views
8

Quello che mi è stato detto, che ha suscitato la mia curiosità su questo argomento:Esempio di classi interne utilizzate in alternativa alle interfacce

Java classi GUI può implementare centinaia di ascoltatori e le richiamate e molti libri insegnano di implementare tutti queste interfacce nella tua classe gui. In alternativa, questi aspetti possono essere implementati nelle classi interne, quindi i metodi chiamati da quegli ascoltatori non vengono confusi.

Mi piacerebbe sapere come farlo in ActionScript, che non ha classi interne, ma ha classi private. Ma, non penso di rendermi pienamente conto di cosa sono le classi interne, quindi sto semplicemente cercando di comprendere la situazione in cui li userò per organizzare i metodi di una classe con i loro usi.

Si prega di mostrare un esempio di come questo apparirebbe in ActionScript, se possibile, altrimenti Java.

+1

Potrebbe inserire un riferimento fonte? –

risposta

5

in Java Sembra che:

new JButton().addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      // code that will be performed on any action on this component 
     } 
    }; 

qui ActionListener - è un'interfaccia, e chiamando new ActionListener() {/*interfaces method implementations goes here*/}; si sta creando classe anonima (anonimo perché non ha nome) - implementazione di tale interfaccia.

Oppure si può fare classe interna come questo:

class MyActionListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     // code that will be performed on any action on this component 
    } 
}; 

e quindi utilizzarlo in questo modo:

new JButton().addActionListener(new MyActionListener()); 

Inoltre si può dichiarare il vostro ascoltatore come un primo livello o classe interna statica. Ma usare la classe interna anonima a volte è molto utile perché consente di implementare l'ascoltatore quasi nello stesso punto in cui è dichiarato il componente che l'ascoltatore ascolta. Ovviamente non sarà una buona idea se il codice dei metodi degli ascoltatori sia molto lungo. Quindi sarebbe meglio spostarlo in una classe interna o statica o anonima non anonimo.

In generale, le classi innner sono classi non statiche che in qualche modo risiedono nel corpo della classe di livello superiore. Qui si possono vedere esempi di loro in 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

Gasan dà un ottimo esempio di come le classi interne sono generalmente utilizzati per le richiamate in Java GUI. Ma in AS3 non lo faresti normalmente in questo modo, perché gli ascoltatori di eventi AS3 sono riferimenti alle funzioni, non interfacce. A questo proposito, AS3 ha più in comune con JavaScript che Java.

Quello che puoi fare in AS3 (proprio come con JavaScript) al posto dei callback anonimi della classe interna è creare chiusure di funzioni.

EDIT: ho trovato un riferimento qui che mi fa risparmiare un sacco di battitura:

ActionScript 3.0 using closures for event handlers

Problemi correlati