2011-05-25 18 views
8

Lo que me dijeron, que despertó mi curiosidad sobre este tema:Ejemplo de clases internas utilizadas como alternativa a las interfaces

clases de GUI de Java pueden aplicar cientos de oyentes y devoluciones de llamada y muchos libros enseñan a implementar todas estas interfaces en tu clase de GUI. Alternativamente, estos aspectos pueden implementarse en clases internas, de modo que los métodos llamados por los oyentes no se mezclen.

Me gustaría saber cómo hacerlo en ActionScript, que no tiene clases internas, pero tiene clases privadas. Pero, no creo que me haya dado cuenta completamente de qué se tratan las clases internas, así que simplemente estoy tratando de entender bien la situación en la que las usaría para organizar los métodos de clase según sus usos.

Por favor, muestre un ejemplo de cómo se vería en ActionScript, de ser posible, de lo contrario, Java.

+1

Podría publicar una referencia de la fuente? –

Respuesta

5

en Java que se ve así:

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

aquí ActionListener - es una interfaz, y llamando new ActionListener() {/*interfaces method implementations goes here*/}; que está creando clase anónima (anónimo porque no tiene nombre) - aplicación de esa interfaz.

O puede presentar clase interna como esto:

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

y luego usarlo como esto:

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

Por otra parte usted puede declarar su oyente como de nivel superior o clase interna estática. Pero el uso de la clase interna anónima a veces es muy útil porque le permite implementar su oyente casi en el mismo lugar donde se declara el componente que las acciones de su oyente están escuchando. Obviamente, no será una buena idea si el código de métodos de los oyentes es muy largo. Entonces sería mejor moverlo a una clase no anónima interna o estática anidada o de nivel superior.

En general, las clases innner son clases no estáticas que de alguna manera residen dentro del cuerpo de la clase de nivel superior. Aquí se puede ver ejemplos de ellas en 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 da un excelente ejemplo de cómo las clases internas se utilizan normalmente para las devoluciones de llamada en las GUI de Java. Pero en AS3 normalmente no lo haría de esta manera, porque los detectores de eventos AS3 son referencias a funciones, no interfaces. En este sentido, AS3 tiene más en común con JavaScript que con Java.

Lo que puede hacer en AS3 (al igual que con JavaScript) en lugar de las devoluciones de llamada de clase interna anónimas es crear cierres de funciones.

EDIT: He encontrado una referencia aquí que me ahorra un montón de escribir:

ActionScript 3.0 using closures for event handlers

Cuestiones relacionadas