1

我正在使用带有 A 类和 B 类的外部库(我无法修改),它们都有 2 个名称相同的 getter(getter1 和 getter2)。

A 和 B 之间没有关系,没有定义 2 个 getter 的超类或接口。

在我的代码中,我想创建一个方法,其参数可以是 A 和 B 类型,我想在其上调用 getter(不关心传递的参数是 A 还是 B 的实例)。

我可以用 getter1 和 getter2 声明一个接口,但我不能强制类 A 和 B 实现这个接口,因为它们驻留在外部代码中。

对于我的代码中的方法,什么是优雅的解决方案?

我不想有 2 种相同的方法,一种带有 A 参数,一种带有 B 参数。

4

2 回答 2

1

如果两者A都不Bfinal,那么您可以使用适配器模式

创建一个接口,其中定义了所需的两个方法,例如Adapter.

interface Adapter {
    String getter1();
    String getter2();
}

创建AB每个实现的子类Adapter

public class AAdapter extends A implements Adapter {}

public class BAdapter extends B implements Adapter {}

然后您的方法可以采用 type 的对象Adapter

如果您不能执行上述操作,因为其中至少有一个是final,那么您将不得不使用组合而不是继承。不要继承Aand B,而是将它们包装在 Adapter 类中。

class AAdapter implements Adapter {
    A a;
    public AAdapter(A a) { this.a = a;}
    @Override public String getter1() {
        return a.getter1();
    }
    @Override public String getter2() {
        return a.getter2();
    }
}
class BAdapter implements Adapter {
    B b;
    public BAdapter(B b) { this.b = b;}
    @Override public String getter1() {
        return b.getter1();
    }
    @Override public String getter2() {
        return b.getter2();
    }
}
于 2021-10-14T20:48:25.597 回答
0

我建议创建自己的类 A' 和 B',它们使用两个类共享的方法实现相同的接口。每个类都应包含相应库类的实例,然后简单地委托(通过调用)该类的方法。这样,您就不会受到方法被称为相同的限制。缺点是额外的样板代码。但好处是,如果您需要非常容易的话,您可以适应第三个库(例如 C)。

搜索“委托模式”以获取更多信息。

于 2021-10-14T20:44:43.543 回答