2012-03-01 8 views
7

Supponiamo di avere un'interfaccia chiamata Interfaccia e una classe concreta chiamata Base, che, per rendere la cosa un po 'più complicata, ha un ctor che richiede alcuni argomenti.Anonimo che estende una classe e implementa un'interfaccia allo stesso tempo?

Mi piacerebbe creare una classe anonima che estendere Base e implementare l'interfaccia.

Qualcosa di simile

Interface get() 
{ 
    return new Base (1, "one") implements Interace() {}; 
} 

Questo sembra ragionevole per me, ma non funziona!

(P.S: In realtà, l'interfaccia e la base sono anche classi generiche:. D Ma io ti ignoro che per ora)

+0

roba generico può diventare incubi se c'è troppo molta astrazione. Keep it simple;) –

risposta

1

Questo lo scenario ha poco senso per me. Ecco perché: assumere classe Base è questo:

class Base { 
    public void foo(); 
} 

e Interface è questo:

interface Interface { 
    public void bar(); 
} 

Ora si desidera creare una classe anonima che sarebbe come questo:

class MyClass extends Base implements Interface { 
} 

questo significherebbe che il metodo MyClass eredita (o eventualmente sostituisce) bar da Base e deve implementare m ethod foo da Interface. Fin qui tutto bene, la tua classe ha questi due metodi in entrambi i modi.

Ora, pensa a cosa succede quando si restituisce un oggetto di tipo Interface dal metodo: si ottiene solo la funzionalità che offre Interface, vale a dire il metodo foo. bar è perso (inaccessibile). Questo ci porta verso il basso per due casi:

  1. Estendere Base è inutile perché non si arriva a usare i suoi metodi, dal momento che il nuovo oggetto è visto come un Interface.
  2. Interface ha anche un metodo foo, ma ciò significherebbe che Base stesso dovrebbe implementare Interface, così puoi semplicemente estendere Base direttamente:
class Base implements Interface { 
    public void foo(); 
    public void bar(); 
} 

class MyClass extends Base { 
} 
+0

Bene, immagino che l'intento di "implementare l'interfaccia" fosse semplicemente quello di eseguire un cast. Userò esempi concreti. Ho un ViewClass che estende la classe Collection. Quindi uso questo ViewClass per implementare set di chiavi e set di valori. Supponiamo che in qualche modo tutte le implementazioni siano in ViewClass, il che significa che tecnicamente non ho bisogno di inserire alcun codice aggiuntivo per il set di chiavi o il set di valori. L'unica cosa rimasta a cui pensare è il tipo. Ovviamente keySet() deve restituire un set, mentre values ​​() deve restituire una Collection. Quindi, per dirla in un altro modo, posso semplicemente fare [return (Set ) nuova Base (...)]? – user113454

+0

In che modo 'MyClass' è anonimo? Ha un nome! –

+0

@Jon Skeet, appunto, ho usato un nome così posso farvi riferimento nella spiegazione. – Tudor

11

No, non è possibile farlo con una classe anonima. È possibile creare una classe denominata all'interno di un metodo, se si vuole veramente però:

class Base { 
} 

interface Interface { 
} 

public class Test { 
    public static void main(String[] args) { 
     class Foo extends Base implements Interface { 
     }; 

     Foo x = new Foo(); 
    } 
} 

Personalmente mi piacerebbe di solito tirare questo fuori in una classe innestata statica me stesso, ma è la vostra scelta ...

+0

Non sapevo che avremmo potuto avere una lezione in un metodo !!! – user113454

+0

@ user1064918: È usato raramente, e per una buona ragione, è difficile da leggere. –

+0

@JonSkeet Ho questo set up, non conosco un altro modo di fare che utilizzare classi con nome all'interno di un metodo. Sono usati solo per fare in modo che il cast di tipo soddisfi il tipo atteso. https: //gist.github.com/imminent/5248440 Sono curioso di sapere in un altro modo, o penso che sia un buon uso legittimo delle classi nominate con un metodo. –

Problemi correlati