2012-05-07 20 views
25

Codice come:In Java, le classi anonime possono estendere un'altra classe?

protected Interface1 varClass1 = new Interface1() { 

Ma vorrei anche che questa classe annidata anonima si estende anche alla classe Base, qualcosa di simile:

protected Interface1 varClass1 = new Interface1() extends Base { 
.... 

Questo è possibile in Java?

+1

@EranMedan - Questa domanda riguarda specificamente entrambe le attività contemporaneamente: estensione di una classe durante l'implementazione di un'interfaccia. L'altra domanda riguarda il fare da soli. –

+0

@DavidHarkness hai ragione, non più SO alle 5 del mattino per me –

+2

Per me, sembra che la tua classe anonima sia un po 'schizofrenica. Soprattutto se ha bisogno di interagire con i campi della classe contenente. Vi consiglio caldamente di meditare se ciò di cui avete davvero bisogno è una leggera riprogettazione. – Buhb

risposta

28

Una classe anonima può implementare esattamente un'interfaccia o estendere una classe.

Una soluzione è quella di creare una classe chiamata che si estende Base e implementa Interface1, e quindi utilizzare che come classe base per la classe anonima:

public abstract class Base1 extends Base implements Interface1 {} 

... 

protected Interface1 varClass1 = new Base1() { 
    ... 
+4

+1, bella soluzione! L'unica cosa che aggiungerei è che se hai bisogno di fare questo, allora è un suggerimento che tu stia allungando oltre l'uso previsto delle classi anonime e dovresti prendere in considerazione invece le classi interne con un nome completo. – mikera

+1

Per limitare l'ambito di 'Base1' puoi addirittura dichiararlo all'interno del metodo, proprio prima che venga usato. – aioobe

+0

@aioobe - All'interno del metodo *? –

3

Anche se non è possibile sia estendere una classe e implementare un'interfaccia, ciò che probabilmente si può fare con l'utilizzo di delegation.

Basta creare un'istanza di Base nell'inizializzatore della classe anonima e utilizzare i relativi metodi dai metodi implementati da Interface1.

EDIT: La mia risposta presuppone che si desidera ereditare solo da Base a causa della sua implementazione, non a causa della sua interfaccia. Si tratta di un'ipotesi valida dato che l'interfaccia di Base non è visibile dopo aver assegnato l'oggetto a una variabile Interface1. Pertanto, penso che sia meglio usare la delega qui invece di creare una nuova classe.

Problemi correlati