【发布时间】:2019-10-15 17:46:27
【问题描述】:
我对实施Strategy pattern 特别感兴趣,其中一个(或多个)策略来自第三方库。
我有一个像这样的类的第三方库:
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();
}
}
但如果可能的话,我宁愿避免这种情况 - 特别是因为我要扩展的类实现了许多其他接口,我宁愿不这样做必须代理每个公共方法。
【问题讨论】:
-
方法定义无关。对象必须实现要转换为它的类/接口。
标签: java android design-patterns interface