好的,我有班级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
的逻辑,以便我们不需要复制?
其他解决方案是使用实用程序静态方法,但这对单元测试不利,因为有人说。
答案 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/
的快速链接