Как мне сделать класс, который я не могу изменить, реализовать интерфейс?
У меня есть класс из другой библиотеки с закрытым исходным кодом, но я хочу иметь возможность использовать интерфейс для него. Причина в том, что я не хочу делатьinstanceof
чеки илиnull
- проверяет везде, но я также не хочу расширять существующий класс.
Например, допустим, у меня есть этот код:
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();
}
}
Я не могу изменитьQuietFoo
:
public class QuietFoo {
public void bar() {
System.out.println("bar");
}
}
Но яМожно менятьLoudFoo
:
public class LoudFoo {
public void bar() {
System.out.println("BAR!!");
}
}
Проблема в том, что может быть много других реализацийbar
во многих классах, и там может быть больше методов, чем простоbar
, так что не только мойhandle
метод становится медленным и уродливым с большим количествомinstanceof
заявления, но я должен был бы написать один из этих методов обработки для каждого метода наQuietFoo
а такжеLoudFoo
, Расширение не является жизнеспособным решением, потому что оно нарушает всеэто контракт сLoudFoo
это неQuietFoo
.
В основном, учитываяFoo
:
public interface Foo {
void bar();
}
Как я могу сделатьQuietFoo
воплощать в жизньFoo
без изменения его источника, поэтому я не должен делать кастинг иinstanceof
звонки везде в моем коде?