gpt4 book ai didi

java - 在 Java 运行时选择要扩展的子类

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:43:37 26 4
gpt4 key购买 nike

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

B、C 和 A 是通过库提供给我的类,我控制的唯一类是 D 类。关于上面提到的约束,我该如何写 D。显然 B 和 C 来自不同的供应商,因此需要在 D 中覆盖不同的方法,具体取决于哪个是其父类。

我不能编写从 B 和 C 子类化的不同版本的 D,因为覆盖方法在不同的方法名称下会有相同的代码。

最佳答案

你应该定义一个接口(interface)I,然后定义对应于BC的具体实现。在运行时,您可以确定 I 的哪个实现是必需的,也许使用工厂方法。然后你的代码只需要调用I的方法而不是BC的方法。

编辑

关于它的工作原理似乎有些困惑。您想要的是让您的业务逻辑在属于您的一致、稳定的 API 上运行。为此,您创建一个接口(interface),我们将其称为 I。现在需要适配的不同外部类(ABC)的实现类。它可能看起来像这样:

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 的实例并调用接口(interface)中定义的方法,抽象出您无法控制的不同具体类。

关于java - 在 Java 运行时选择要扩展的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31646857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com