2012-05-07 19 views
25

-Code wie:Können in Java anonyme Klassen eine andere Klasse erweitern?

protected Interface1 varClass1 = new Interface1() { 

Aber ich möchte auch, dass diese anonyme verschachtelte Klasse auch die Klasse Base, so etwas wie erweitert: in Java

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

Ist das möglich?

+1

@EranMedan - Diese Frage bezieht sich speziell auf beides gleichzeitig: Erweiterung einer Klasse während der Implementierung einer Schnittstelle. Die andere Frage besteht darin, einen einzigen zu machen. –

+0

@DavidHarkness Sie haben Recht, nicht mehr SO um 5 Uhr für mich –

+2

Für mich fühlt es sich an wie Ihre beabsichtigte anonyme Klasse ist ein bisschen schizophren. Vor allem, wenn es mit Feldern der enthaltenden Klasse interagieren muss. Ich schlage vor, dass Sie darüber meditieren, wenn Sie wirklich ein leichtes Redesign benötigen. – Buhb

Antwort

28

Eine anonyme Klasse kann entweder genau eine Schnittstelle implementieren oder eine Klasse erweitern.

Eine Abhilfe ist, eine benannte Klasse zu erstellen, die Base und implementiert Interface1, und verwenden Sie dann, dass als Basisklasse für die anonyme Klasse erweitert:

public abstract class Base1 extends Base implements Interface1 {} 

... 

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

+1, nette Lösung! Ich möchte nur hinzufügen, dass, wenn Sie dies tun müssen, es ein Hinweis darauf ist, dass Sie über den beabsichtigten Gebrauch von anonymen Klassen hinausgehen und stattdessen vielleicht stattdessen vollständig benannte innere Klassen in Erwägung ziehen sollten. – mikera

+1

Um den Umfang von 'Base1' zu begrenzen, können Sie es sogar direkt vor der Verwendung in der Methode deklarieren. – aioobe

+0

@aioobe - Innerhalb der * Methode? * –

3

Während es nicht möglich ist, sowohl eine Klasse zu erweitern und implementieren Sie eine Schnittstelle, was Sie wahrscheinlich tun können, mit delegation erreicht werden.

Erstellen Sie einfach eine Instanz von Base im Initialisierer Ihrer anonymen Klasse und verwenden Sie deren Methoden aus den Methoden, die Sie implementieren von Interface1.

EDIT: Meine Antwort geht davon aus, dass Sie nur von Base erben wollen wegen seiner Umsetzung, nicht wegen seiner Schnittstelle. Dies ist eine gültige Annahme, da die Schnittstelle Base nicht sichtbar ist, nachdem das Objekt einer Variablen Interface1 zugewiesen wurde. Daher denke ich, dass es besser ist, Delegierung hier zu verwenden, anstatt eine neue Klasse zu erstellen.

Verwandte Themen