Я особенно заинтересован в реализации шаблона стратегии , где одна (или более) из стратегий поступает из сторонней библиотеки.
У меня есть сторонняя библиотека стакой класс:
public class LibraryClass {
public void doSomething() {
// ...
}
}
Затем я создал свой собственный класс с таким же интерфейсом:
public class MyClass {
public void doSomething() {
// ...
}
}
Теперь в своем коде я хочу сделать следующее:
public class MainActivity extends AppCompatActivity {
public interface Strategy {
void doSomething();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
Strategy oneClass = (Strategy)(new MyClass());
Strategy twoClass = (Strategy)(new LibraryClass());
oneClass.doSomething();
twoClass.doSomething();
}
}
В этом случае метод существует, поэтому интерфейс технически допустим, но он не был явно реализован. Когда я попытался сделать это, он выдал ошибку во время выполнения:
java.lang.ClassCastException: MyClass cannot be cast to MainActivity$Controls
Наихудший сценарий, который я знаю, я могу использовать Proxy pattern , чтобы обернуть LibraryClass
в нечто, что действительно реализует интерфейс Strategy
:
public class LibraryClassProxy implements Strategy {
private LibraryClass internal;
public void LibraryClassProxy() {
internal = new LibraryClass();
}
public void doSomething() {
internal.doSomething();
}
}
Но я бы предпочел избежать этого, если это возможно - в частности, потому что класс, который я расширяю, реализует много других интерфейсов , и я бы предпочел не использовать прокси для каждого публичного метода.