在接口I中有方法X,类C1和& C2使用methodX的确切代码,那么将Logic放入methodX的位置? (JAVA)

时间:2014-02-26 01:27:34

标签: java

好的,我有班级C1& C2,两者都已经扩展了其他类

public class C1 extends M{
    public double calCost(double price, int qty){
        return price*qty;
    }
}

public class C2 extends N{
    public double calCost(double price, int qty){
        return price*qty;
    }
}

事实上,我的calCost非常复杂,所以我不想复制确切的代码calCost,因为它很难维护。

所以,我知道我们需要使用像

这样的界面
interface Calculation{
    public void calCost();
}

&安培;然后我们喜欢public class C1 extends M implements Calculation& public class C2 extends M implements Calculation,但我们仍然需要在C1&中复制calCost的相同逻辑。 C2。所以,

在哪里放置calCost的逻辑,以便我们不需要复制?

其他解决方案是使用实用程序静态方法,但这对单元测试不利,因为有人说。

3 个答案:

答案 0 :(得分:3)

您需要使用称为abstract class的内容。

abstract class Calculation {
    public int calCost(int x, int y) {
        // put your long definition here
        return x + y;
    }
}

class FirstCalc extends Calculation {
    public void someOtherMethod() {
        int a = 10;
        int b = 20;
        int c = calCost(a, b);
        System.out.println(c);
    }
}

如果您希望扩展calCost类的每个类来定义自己的实现,也可以使abstract成为Calculation方法。

或者,使用构图:

class Calculation { 
    public int calCost(int x, int y) { 
        return x + y; //or other implementation 
    }
}

class C1 extends M {
    private Calculation calculation = new Calculation();
    public void someOtherMethod() {
        int a = 10;
        int b = 20;
        int c = calculation.calCost(a, b);
    }
}

class C2 extends M {
    private Calculation calculation = new Calculation();
    public void someOtherOtherMethod() {
        // ...
        int c = calculation.calCost(10, 20);
    }
}

答案 1 :(得分:1)

您可以创建一个抽象类来实现calCost,让C1和C2扩展它。

public abstract class CA extends M {
    public double calCost(double price, int qty){
        return price*qty;
    }
}

public class C1 extends CA {
    ....
}

public class C2 extends CA {
    ....
}

由于CA是抽象的,因此您不需要覆盖任何其他方法,并且C1和C2可以分别处理所有其他方法的实现。

答案 2 :(得分:1)

您已经使用两个不同的类扩展了类。 您无需一直依赖IS-A。您可以创建另一个实例类,并通过传递适当的参数将calCost推送到该类,并具有HAS-A关联。

此外,在Java 8中,接口将允许我们为方法提供默认实现。这可能不会成为一个问题。这是一个关注http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/

的快速链接