事后实现接口

Ing*_*ngo 5 java oop design-patterns interface

我认为,以下不能用Java完成.但我很乐意学习如何实现类似于它的东西.

假设我们有一个C类,它已经在编译代码中使用了.(我们既不能改变代码也不能改变C的原始定义).

进一步假设有一些有趣的代码可以重复使用,如果只有C实现接口I.事实上,导出D只是C +接口方法的实现,或多或少是微不足道的.

然而,一旦我有一个C,似乎没有办法说:我希望你成为一个D,也就是说,一个C实现我.

(旁注:我认为如果D是C,那么应该允许c的运行时类型为C的强制转换(D)c,并且C的唯一区别是添加方法.这应该是安全的,如果不是吗?)

怎么能解决这场灾难呢?

(我知道工厂设计模式,但这似乎不是一个解决方案.因为,一旦我们设法在以前是C的所有地方创建D,其他人发现另一个接口J有用并导出E扩展C实现J.但是E和D是不兼容的,因为它们都为C添加了一组不同的方法.因此,虽然我们总是可以传递一个预期C的E,但是我们不能通过一个预期D的E.而是,现在,我们需要一个新类F扩展C实现I,J.)

Aln*_*tak 10

难道你不能使用委托类,即包装"C类"实例的新类,还实现"接口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
}
Run Code Online (Sandbox Code Playgroud)

然后,如果你需要调用一个通常采用类型参数的函数,I只需执行以下操作:

result = some_function(new D(c));
Run Code Online (Sandbox Code Playgroud)


Mah*_*eTo 7

如果您需要兼容的只是接口,那么看看动态代理类没有问题,它基本上是如何在运行时在java中实现接口的.

如果您需要与类类似的运行时兼容性,我建议您查看cglib或javaassist开源库.