- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对实现 Strategy pattern 特别感兴趣其中一个(或多个)策略来自第三方库。
我有一个第三方库,其中包含这样的类:
public class LibraryClass {
public void doSomething() {
// ...
}
}
然后我使用相同的接口(interface)创建了自己的类:
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();
}
}
在本例中,该方法存在,因此该接口(interface)技术上有效,但并未显式实现。当我尝试这样做时,它引发了运行时错误:
java.lang.ClassCastException: MyClass cannot be cast to MainActivity$Controls
最坏的情况我知道我可以使用 Proxy pattern将 LibraryClass
包装在确实实现 Strategy
接口(interface)的内容中:
public class LibraryClassProxy implements Strategy {
private LibraryClass internal;
public void LibraryClassProxy() {
internal = new LibraryClass();
}
public void doSomething() {
internal.doSomething();
}
}
但如果可能的话,我宁愿避免这种情况 - 特别是因为我扩展的类实现许多其他接口(interface),而我宁愿不这样做必须代理每个公共(public)方法。
最佳答案
正如其他人指出的那样,Java 中的接口(interface)定义基于显式声明。我相信 Adapter 涵盖了您所描述的情况。设计模式,而不是代理:
Intent: Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces. ---GoF p. 139
您指出的“代理”解决方案对应于适配器模式的对象变体。如果 LibraryClass
不是最终版本,可以考虑的一个选择是使用模式的 class 变体:
class MyLibraryClass extends LibraryClass implements Strategy {
/* ... */
}
关于java - 您可以将对象强制转换为它未显式实现的接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58400073/
我是一名优秀的程序员,十分优秀!