选择在运行时从java扩展的子类

前端之家收集整理的这篇文章主要介绍了选择在运行时从java扩展的子类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有两个类(比如B& C),它们都来自一个类(比如说A).现在我需要编写一个类(比如D),它应该在运行时从B或C动态派生.

B,C& A是通过库提供给我的类,我控制的唯一类是D类.如何针对上述约束编写D.显然,B和C来自不同的供应商,因此需要在D中覆盖不同的方法,具体取决于它的父类.

我不能写出不同版本的D,它们将从B& C,因为覆盖方法在不同的方法名下具有相同的代码.

最佳答案
您应该定义一个接口I,然后定义对应于B和C的具体实现.在运行时,您可以使用工厂方法确定I的哪个实现是必要的.那么你的代码只需要调用I的方法而不是B或C的方法.

编辑

关于它是如何工作的似乎有些混乱.您想要的是您的业务逻辑在属于您的一致,稳定的API上运行.为此,您将创建一个我们称之为I的接口.现在您需要适应(A,B和C)所需的不同外部类的实现类.它可能看起来像这样:

public interface I {
    void doSomething();
}

public class IA implements I {
    private A a;

    public IA(A a) {
        this.a = a;
    }

    public void doSomething() {
        // specific to A
        a.doSomethingUnique();
    }
}

// similar implementation classes for B and C

现在,您需要在运行时获取特定于当前情况的I实例.无论通知您何时在运行时使用哪个特定类都可以用于此目的.在最坏的情况下,你可以这样做:

// in some util class
public static I getI(Object obj) {
    if (obj instanceof A) {
        return new IA((A) obj);
    } else if (obj instanceof B) {
        return new IB((B) obj);
    } else if (obj instanceof C) {
        return new IC((C) obj);
    }
    // maybe throw an exception? or return a mock I implementation?
}

现在,您的所有业务逻辑仅引用I的实例并调用接口中定义的方法,从而抽象出您无法控制的不同具体类.

原文链接:https://www.f2er.com/android/431298.html

猜你在找的Android相关文章