我有 - 工人界面。 每个工人都有精力充沛。
public interface Worker {
int work();
double getEnergy();
}
和 - 实施工人接口的juniorWorker类。 初级工人有100个能量。
public class juniorWorker implements Worker {
public int work() {
return (int) getEnergy();
}
public double getEnergy() {
return 100;
}
}
还有 - effectiveWork,实现工人接口的powerWork类。 高效工作将减少20%的能源。 powerWork将能量提高10%。
public class efficientWork implements Worker {
private Worker worker;
public efficientWork(Worker w) {
this.worker=w;
}
public int work() {
return (int) (worker.getEnergy()*getEnergy());
}
public double getEnergy() {
return 0.8;
}
}
public class PowerWork implements Worker {
private Worker worker;
public PowerWork(Worker w) {
this.worker=w;
}
public int work() {
return (int) (worker.getEnergy()*getEnergy());
}
public double getEnergy() {
return 1.1;
}
}
实际上,我正在尝试 int work()将总计每个工作人员将花费的总能量。 例如,我的演示类:
public class Demo {
public static void main(String[] args) {
Worker j= new efficientWork(new juniorWorker());
System.out.println(j.work());
}
}
此案例正在工作 - 系统将打印 80 。
但是这个例子,总是打印0:
public class Demo {
public static void main(String[] args) {
Worker j= new efficientWork(new PowerWork(new juniorWorker()));
System.out.println(j.work());
}
}
帮助?我期待得到88! (110 * 0.8)
答案 0 :(得分:1)
看看heirarchy的电话
efficientWork.work()
调用worker.getEnergy()
,PowerWork
为worker
。 PowerWork.getEnergy()
返回1.1。
1.1 * 0.8 = 0.88,然后转换为int并变为0。
答案 1 :(得分:1)
您应该在其work()
方法中的装饰器中保存的封闭工作对象上调用getEnergy()
而不是work()
方法。
// decorator's work method
public int work() {
// return (int) (worker.getEnergy() * getEnergy()); // NO!
return (int) (worker.work() * getEnergy()); // YES!
}
答案 2 :(得分:1)
在您的代码中,efficientworker.work()
在逻辑上扩展为
(int)(efficientWork.getEnergy() * PowerWork.getEnergy())
= (int)(0.8 * 1.1)
= (int)(0.88)
= 0