我试图使用没有switch case或if / else语句的跳转表来创建一个简单的4函数计算器。我知道我可以通过函数指针创建跳转表,但我很好地消隐了。我已经开始使用程序的加法和减法部分,但我正在尝试掌握要使用的设计/策略。将方法放入数组时我也遇到错误,到目前为止这就是我所拥有的:
public class Calculator {
public abstract class Functor{
abstract double Compute(double op1, double op2);
}
class Addition extends Functor
{
public double Compute(double op1, double op2){ return op1 + op2;}
}
class Subtraction extends Functor
{
public double Compute(double op1, double op2){ return op1 - op2;}
}
public static void main(String[] args) {
Functor add = new Addition(); // Problem here
Functor sub = new Subtraction(); // and here
}
}
非常感谢任何有关正确方向的步骤的帮助或想法! 提前谢谢!
答案 0 :(得分:3)
让我们试试这个:
public enum Operation {
PLUS("+") {
double apply(double x, double y) { return x + y; }
},
MINUS("-") {
double apply(double x, double y) { return x - y; }
},
TIMES("*") {
double apply(double x, double y) { return x * y; }
},
DIVIDE("/") {
double apply(double x, double y) { return x / y; }
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
@Override public String toString() {
return symbol;
}
abstract double apply(double x, double y);
}
这仅适用于使用具有泛型和枚举的Java 5或更高版本。它的作用是为您提供一组静态操作。您可以通过键入Operation.PLUS
或Operation.MINUS
等来访问它们
要测试它,请尝试:
public static void main(String[] args) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
for (Operation op : Operation.values())
System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
}
有关更多信息,请参阅Joshua Bloch的 Effective Java,Second Edition 。
值得指出的是,Java没有“函数指针”的概念。相反,您只需编写一个接口并编写一个实现该接口的类。在运行时选择要使用的正确类;因此,这是一个“跳转表”,但它隐藏在面向对象编程的语义背后。这称为多态。
答案 1 :(得分:2)
虽然这很不错(除了没有正常工作的构造函数),我会使用匿名类做不同的。
abstract class Functor {
public abstract double compute(double a, double b);
public static void main(String[] args) {
Functor add = new Functor() {
// defining it here is essentially how you do a function pointer
public double compute(double a, double b) { return a + b; }
};
Functor subtract = new Functor() {
public double compute(double a, double b) { return a - b; }
};
System.out.println(add.compute(1.0,2.0));
System.out.println(subtract.compute(1.0,2.0));
}
}
结果:
C:\Documents and Settings\glowcoder\My Documents>java Functor
3.0
-1.0
C:\Documents and Settings\glowcoder\My Documents>
答案 2 :(得分:0)
你没有任何构造函数可以传递给你的子类的任何参数,我不明白你如何设置opt1
和opt2
将被设置为没有任何构造函数作为参数。现在这不是正确的Java代码。