java - 事后实现接口(interface)

标签 java design-patterns oop interface

我认为,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/

相关文章:

java - 如何在 REST 客户端中发出发送行列表的请求 -Android

java - 观察者模式与单一职责原则的违背

java - 需要从js发送json数据到java

java - 性能 - 用Java进行字符串操作以获得最多重复的字符

Java:可以访问父类(super class)字段和方法的策略模式?

javascript - JS 中的对象命名

java - 观察者设计模式的主题是接口(interface)还是父类(super class)?

java - 如何通过 OOP 打印多个值而不用在 Java 中添加它们

java - Android sqlite 保持连接打开

javascript - 如何改进我的 javascript 模式以获得更大的灵活性/可维护性?