class A extends ApiClass
{
public void duplicateMethod()
{
}
}
class B extends AnotherApiClass
{
public void duplicateMethod()
{
}
}
我有两个扩展不同api类的类。这两个类有一些重复 方法(在两个类中重复相同的方法)以及如何删除这种重复?
ApiClass和AnotherApiClass都不在我的控制之下
答案 0 :(得分:2)
根据代码的不同,您可以执行以下操作:
public class Util
{
public static void duplicateMethod()
{
// code goes here
}
}
然后让另外两个duplicateMethods调用那个。因此代码不会重复,但方法名称和对Util.duplicateMethod的调用将是。
如果Util.duplicateMethod中的代码需要访问A和B类的实例/类变量,那么它就不会很好用,但它可能会完成(如果你需要,请告诉我)。 / p>
编辑(根据评论):
使用实例变量它变得不那么漂亮......但是可以完成。类似的东西:
interface X
{
int getVar();
void setVar(A a);
}
class A
extends ApiClass
implements X
{
}
class B
extends AnotherApiClass
implements X
{
}
class Util
{
public static void duplicateMethod(X x)
{
int val = x.getVal();
x.setVal(val + 1);
}
}
因此,对于您需要访问的每个变量,您将为get创建一个方法(并在需要时设置)。我不喜欢这种方式,因为它使get / set方法公开,这可能意味着你正在提供你不想要的东西。另一种方法是用反射做一些事情,但我更喜欢这样: - )
答案 1 :(得分:1)
听起来像“战略模式”的情况。
class A extends ApiClass {
private ClassContainingDupMethod strategy;
}
class N extends AnotherApiClass {
private ClassContainingDupMethod strategy;
public methodCallingDupMethod(){
strategy.dupMethod();
}
}
class ClassContainingDupMethod{
public dupMethod(){;}
}
或者是Api类中的dupMethod?
答案 2 :(得分:1)
依赖于成员变量的重复方法也意味着重复的成员变量 - 并且开始闻起来像太大的类。如果您要将这些变量提取到自己的类中,然后将该类组成其他类,那么这些特定成员变量(使用方法)会是什么样子? Prefer composition over inheritance
答案 3 :(得分:0)
class BaseApiClass
{
public void duplicateMethod()
{
}
}
class ApiClass extends BaseApiClass
{
}
class AnotherApiClass extends BaseApiClass
{
}
class A extends ApiClass
{
}
class B extends AnotherApiClass
{
}
答案 4 :(得分:0)
您需要将这些类组合成一个对象,然后使用其他两个类将所有类组合在一起,修改它们的代码以使用单个类。