Var*_*tia 5 java oop android design-patterns subclass
我有两个类(比如B&C),它们都来自一个类(比如说A).现在我需要编写一个类(比如D),它应该在运行时从B或C动态派生.
B,C&A是通过图书馆提供给我的课程,我控制的唯一课程是D课程.如何针对上述约束编写D. 显然,B和C来自不同的供应商,因此需要在D中覆盖不同的方法,具体取决于它的父类.
我不能编写从B&C继承的不同版本的D,因为覆盖方法在不同的方法名下会有相同的代码.
您应该定义一个接口,然后定义与和I
相对应的具体实现。在运行时,您可以确定需要哪个实现,也许可以使用工厂方法。那么你的代码只需要调用 的方法而不是or的方法。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
Run Code Online (Sandbox Code Playgroud)
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?
}
Run Code Online (Sandbox Code Playgroud)
现在,您的所有业务逻辑仅引用I
接口中定义的实例并调用方法,抽象出您无法控制的不同具体类。