2010-01-27 6 views
12

Ich weiß, dass wir in Java keine letzte Klasse erweitern können. Aber gibt es einen alternativen Weg, wo ich die Wirkung habe, eine letzte Klasse zu erweitern?Entspricht dem Erweitern einer letzten Klasse in Java

Weil ich eine letzte Klasse mit den Anforderungen habe, die ich suche, also wenn ich irgendwie dieses wiederverwenden könnte, wäre es eine große Hilfe für mich.

Antwort

27

Erstellen Sie einen Wrapper für die letzte Klasse?

Etwas wie folgt aus:

class MyClass { 
    private FinalClass finalClass; 

    public MyClass { 
     finalClass = new FinalClass(): 
    } 

    public void delegatingMethod() { 
     finalClass.delegatingMethod(); 
    } 
} 

Eine Wrapper-Klasse wie MyClass wird nicht als Instanz von FinalClass akzeptiert werden. Wenn FinalClass Schnittstellen implementiert, können Sie sie in MyClass implementieren, um die Klassen ähnlicher zu machen. Das gleiche gilt für alle nicht-endgültigen Eltern der FinalClass; In diesem Fall sollte Ihr Entwurf MyClass mit diesen Elternklassen kompatibel sein.

Es ist sogar möglich, eine Wrapper-Klasse während der Laufzeit mit Reflektion zu erstellen. In diesem Fall können Sie die Proxy class verwenden. Beachten Sie, dass Proxy-Klassen detailliertes Wissen über das Java-Typsystem benötigen.

+1

In der Praxis funktioniert dies jedoch nur, wenn die umwickelte Klasse eine Art Schnittstelle/abstrakte Klasse implementiert und Sie eine Wrapper-Instanz anstelle des Originals bereitstellen können. Wenn Sie beides nicht tun können, dann ist das mit dem Refactoring des Originals schwierig. –

+0

Natürlich können Sie nicht alle Instanzen von FinalClass durch MyClass ersetzen. Sie können jedoch Ihre eigene Schnittstelle definieren, um FinalClass mit MyClass zu umbrechen. Referenzieren Sie FinalClass niemals außerhalb von MyClass. – Arne

+0

@ArneJan, meinst du, dass ich in keiner anderen Klasse auf das Feld "finalClass" verweisen sollte? Warum? –

3

Die einfachste Option wäre, einen Wrapper zu schreiben, der eine Instanz der letzten Klasse als Membervariable enthält und als Proxy für die letzte Klasse fungiert.

Auf diese Weise können Methoden der letzten Klasse leicht überschrieben oder erweitert werden.

Verwandte Themen