Wie erstelle ich eine Klasse, die ich nicht ändern kann, um eine Schnittstelle zu implementieren?
Ich habe eine Klasse aus einer anderen Bibliothek, die Closed Source ist, aber ich möchte eine Schnittstelle dafür verwenden können. Der Grund dafür ist, dass ich nicht machen willinstanceof
Schecks odernull
-checks überall, aber ich möchte die bestehende Klasse auch nicht erweitern.
Angenommen, ich habe folgenden Code:
public class Example {
// QuietFoo is from another library that I can't change
private static QuietFoo quietFoo;
// LoudFoo is my own code and is meant to replace QuietFoo
private static LoudFoo loudFoo;
public static void main(String[] args) {
handle(foo);
}
private static void handle(Object foo) {
if (foo instanceof QuietFoo)
((QuietFoo) foo).bar();
else if (foo instanceof LoudFoo)
((LoudFoo) foo).bar();
}
}
Ich kann mich nicht ändernQuietFoo
:
public class QuietFoo {
public void bar() {
System.out.println("bar");
}
}
Aber ichkönnen VeränderungLoudFoo
:
public class LoudFoo {
public void bar() {
System.out.println("BAR!!");
}
}
Das Problem ist, dass es viele andere Implementierungen von geben kannbar
in vielen Klassen und es kann mehr Methoden als nur gebenbar
, so würde nicht nur meinehandle
Methode langsam und hässlich mit vielinstanceof
Anweisungen, aber ich müsste eine dieser Handle-Methoden für jede Methode auf schreibenQuietFoo
undLoudFoo
. Das Erweitern ist keine praktikable Lösung, da es das Ganze verletztist ein Vertrag seitLoudFoo
ist keinQuietFoo
.
Grundsätzlich gegebenFoo
:
public interface Foo {
void bar();
}
Wie kann ich machenQuietFoo
implementierenFoo
ohne die Quelle zu ändern, muss ich also kein Casting machen undinstanceof
Anrufe überall in meinem Code?