Как мне сделать класс, который я не могу изменить, реализовать интерфейс?
У меня есть класс из другой библиотеки с закрытым исходным кодом, но я хочу иметь возможность использовать интерфейс для него. Причина в том, что я нене хочу делать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();
}
}
Я могу't изменить: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
звонки везде в моем коде?