2010-06-15 4 views
21

Come potrei fare per scrivere un costruttore per una classe interna che sta implementando un'interfaccia? So che potrei fare una nuova classe intera, ma immagino che ci deve essere un modo per fare qualcosa lungo la linea di questo:Costruttori in classi interne (implementazione di interfacce)

JButton b = new JButton(new AbstractAction() { 

    public AbstractAction() { 
     super("This is a button");       
    } 


    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

Quando entro in questo che non riconosce il metodo AbstractAction come costruttore (il compilatore chiede il tipo di reso). Qualcuno ha un'idea?

+6

Quando raggiungi il limite di ciò che le classi interne anonime possono fare, allora è un forte suggerimento che dovresti invece scrivere una normale classe interiore. –

risposta

35

basta inserire i parametri dopo il nome della classe estesa:

JButton b = new JButton(new AbstractAction("This is a button") { 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

Inoltre, è possibile utilizzare un blocco di inizializzazione:

JButton b = new JButton(new AbstractAction() { 

    { 
     // Write initialization code here (as if it is inside a no-arg constructor) 
     setLabel("This is a button") 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 
+0

risponde perfettamente alla mia domanda, grazie! – thepandaatemyface

4

La classe risultante non è di tipo AbstractAction, ma di una certa (senza nome, anonimo) tipo che estende/implementa AbstractAction. Pertanto un costruttore per questa classe anonima dovrebbe avere questo nome 'sconosciuto', ma non AbstractAction.

E 'come normale estensione/implementazione: se si definisce un class House extends Building e costruire un House è il nome del costruttore e non HouseBuilding (o AbstractAction solo a COM di nuovo alla domanda originale).

9

Se davvero bisogno di un contructor per qualsiasi motivo, è possibile utilizzare un blocco di inizializzazione:

JButton b = new JButton(new AbstractAction() { 

    { 
     // Do whatever initialisation you want here. 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

Ma non si può chiamare un costruttore super-classe da lì. Tuttavia, come ho detto Itay, puoi semplicemente passare l'argomento che vuoi inserire nella nuova chiamata.

Personalmente, però, vorrei creare una nuova classe interna per questo:

private class MyAction extends AbstractAction { 

    public MyAction() { 
     super("This is a button."); 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
} 

poi:

JButton b = new JButton(new MyAction()); 
1

Il motivo che il compilatore si lamenta è perché si sta tentando di dichiarare un costruttore all'interno della vostra classe anonima, che non è consentita per le classi anonime. Come altri hanno già detto, è possibile risolverlo utilizzando un inizializzatore di istanze o convertendolo in una classe non anonima, quindi è possibile scrivere un costruttore per esso.