我认为,Java 无法完成以下操作。但我很乐意学习如何实现类似的东西。
假设我们有一个已经在编译代码中使用的类 C。 (我们既不能更改该代码,也不能更改 C 的原始定义)。
进一步假设有有趣的代码可以重用,只要 C 实现接口(interface) I。事实上,派生 D 只是 C + 接口(interface)方法的实现或多或少是微不足道的。
可是,好像没有办法,一旦我有了C,就说:我要你做D,也就是实现I的C。
(旁注:我认为如果 D 是 C 并且与 C 的唯一区别是添加的方法,则应该允许转换 (D)c,其中 c 的运行时类型是 C。这应该是安全的,不是吗? )
如何解决这场灾难?
(我知道工厂设计模式,但这似乎不是解决方案。因为,一旦我们设法在以前是 C 的所有地方创建 D,其他人就会发现另一个有用的接口(interface) J 并派生 E extends C实现 J。但是 E 和 D 是不兼容的,因为它们都向 C 添加了一组不同的方法。因此,虽然我们总是可以在需要 C 的地方传递 E,但我们不能在需要 D 的地方传递 E。而是,现在,我们需要一个新的类 F 扩展 C 实现 I,J。)
最佳答案
您不能使用委托(delegate)类,即包装“C 类”实例但还实现“接口(interface) I”的新类吗?
public class D implements I {
private C c;
public D (C _c) {
this.c = _c;
}
public void method_from_class_C() {
c.method_from_class_C();
}
// repeat ad-nauseum for all of class C's public methods
...
public void method_from_interface_I() {
// does stuff
}
// and do the same for all of interface I's methods too
}
然后,如果您需要调用通常采用 I
类型参数的函数,只需执行以下操作:
result = some_function(new D(c));
关于java - 事后实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/752001/