2009-10-26 19 views
10

Ich habe eine Klasse A und schreibe eine Unterklasse B. A hat nur einen Konstruktor, der parametrisiert ist. B muss diesen Superkonstruktor von A nennen. Jetzt möchte ich ein Objekt als Parameter verwenden. Dieses Objekt sollte eine Methode von B aufrufen. Also muss das Parameter-Objekt eine Referenz von B enthalten oder muss eine innere Klasse sein.Mit "this" beim Aufruf des Super-Konstruktors?

public B(){ 
    super.(new parameter(this)) 
} 

Nun, wenn ich den Konstruktor aufrufen wollen wie ... Eclipse-sagt:

nicht auf 'diese' noch 'super' beziehen kann, während explizit einen Konstruktor

Der Aufruf Das einzige, was ich sehe, um dies zu umgehen, ist eine Set-Methode, um die "this" -Instanz in das Parameter-Objekt zu injizieren. Ich möchte die Superklasse nicht bearbeiten.

Sehen Sie einen besseren Weg um dies zu erreichen.

+0

Über was * Sprache * redest du? –

+11

siehe das Tag Jonathan ... sein Java – craftsman

Antwort

17

Der Compiler verhindert wirklich, dass Sie sich hier in den Fuß schießen. B wird erst nach dem Aufruf des Superkonstruktors vollständig aufgebaut. Wenn Sie dies also (wenn der Compiler dies zulässt) als Referenz übergeben und eine Methode auf B aufruft, wäre B in einem ungültigen Zustand und würde alle Arten verursachen von unangenehmen Problemen (tatsächlich ist A immer noch nicht initialisiert, noch irgendeine Klasse in der Kette, einschließlich Objekt).

Die naheliegende Lösung besteht darin, die Funktionalität außerhalb von B bereitzustellen und diese dem Konstruktor des Parameters zu übergeben. Bestimmte Lösungen hängen von dem spezifischen Problem ab, aber eine statische verschachtelte Klasse in B (sie muss aus dem gleichen Grund statisch sein - eine innere Klasse hat einen impliziten Verweis auf die äußere Klasseninstanz) könnte diese Funktionalität vielleicht bereitstellen. Vielleicht müssen Sie die Beziehung zwischen dem Parameter B und seiner Superklasse überdenken. Es kommt auf den Fall an.

+0

Ich weiß, wie man es löst. Das eigentliche Problem ist, dass die Superklasse "alter" Code ist. Ich verwende es in einem etwas anderen Kontext wieder. Ich war auf der Suche nach einer eleganten Lösung. Aber ich denke, es gibt kein. Das ist der Preis für die Wiederverwendung des alten Codes. –

+2

Sie könnten es einfach zusammenstellen, indem Sie die neue Klasse als Wrapper um den alten legen. Implementiert die alte Klasse eine Schnittstelle, die Sie mit Ihrem neuen Objekt implementieren können? – Joe

+1

@ c0d3x, könnten Sie Ihre Lösung (in einer separaten Frage) posten und fragen, ob es eine elegantere Lösung gibt. Wenn Sie Ihre Lösung sehen, können Sie viele Fragen zu dem jeweiligen Fall beantworten. – Yishai

Verwandte Themen