Jak utworzyć klasę, której nie mogę zmienić, zaimplementować interfejs?
Mam klasę z innej biblioteki, która jest zamkniętym źródłem, ale chcę mieć możliwość korzystania z interfejsu. Powodem jest to, że nie chcę tego robićinstanceof
czeki lubnull
-checks wszędzie, ale nie chcę też rozszerzać istniejącej klasy.
Załóżmy na przykład, że mam ten kod:
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();
}
}
Nie mogę się zmienićQuietFoo
:
public class QuietFoo {
public void bar() {
System.out.println("bar");
}
}
Ale jamogą zmianaLoudFoo
:
public class LoudFoo {
public void bar() {
System.out.println("BAR!!");
}
}
Problem polega na tym, że może istnieć wiele innych implementacjibar
w wielu klasach i może być więcej metod niż tylkobar
, więc nie tylko mójhandle
metoda staje się powolna i brzydka z dużą ilościąinstanceof
instrukcji, ale musiałbym napisać jedną z tych metod obsługi dla każdej metodyQuietFoo
iLoudFoo
. Rozszerzenie nie jest realnym rozwiązaniem, ponieważ narusza całośćjest kontrakt odLoudFoo
nie jestQuietFoo
.
Zasadniczo podaneFoo
:
public interface Foo {
void bar();
}
Jak mogę to zrobićQuietFoo
wprowadzić w życieFoo
bez zmiany źródła, więc nie muszę robić castingu iinstanceof
połączenia wszędzie w moim kodzie?