如何通过抽象类实现函数指针的Java等价物
我试图创建一个简单的4函数计算器,使用跳转表而不使用switch case或if/else语句。我知道我可以通过函数指针创建跳转表,但我有点空白。我从程序的加减法部分开始,但我试图掌握要使用的设计/策略。在将方法放入数组时,我也遇到了一个错误,到目前为止,我得到的是:如何通过抽象类实现函数指针的Java等价物,java,class,function,pointers,abstract,Java,Class,Function,Pointers,Abstract,我试图创建一个简单的4函数计算器,使用跳转表而不使用switch case或if/else语句。我知道我可以通过函数指针创建跳转表,但我有点空白。我从程序的加减法部分开始,但我试图掌握要使用的设计/策略。在将方法放入数组时,我也遇到了一个错误,到目前为止,我得到的是: public class Calculator { public abstract class Functor{ abstract double Compute(double op1
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
}
}
非常感谢您对正确方向的任何帮助或想法!
提前谢谢 您没有任何构造函数可以将任何参数传递给您的子类,我不理解您如何认为
opt1
和opt2
将在没有任何构造函数作为参数的情况下进行设置。现在这不是正确的Java代码。虽然这很不错(除了没有正常工作的构造函数),但我会使用匿名类来做不同的事情
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>
让我们试试这个:
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);
}
这只有在您使用Java5或更高版本时才起作用,它具有泛型和枚举。它所做的是为您提供一组静态操作。您可以通过键入Operation.PLUS
或Operation.PLUS
等来访问它们
要测试它,请尝试以下操作:
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的《有效Java》,第二版
值得指出的是,Java没有“函数指针”的概念。而是简单地编写一个接口并编写一个实现该接口的类。在运行时选择要使用的正确类;因此,这是一个“跳转表”,但它隐藏在面向对象编程的语义后面。这就是所谓的多态性,它是Java代码。看来他所有的类都是以大写字母开头的,虽然他可能有一个bug(他从来没有找到他的变量),但最确定的是Java代码。他们不需要任何参数,傻瓜我…编辑已经完成,现在要去解决初始化具体类的问题。每次出现这种情况,我真的很想回到斯卡拉!在阅读java设计模式时,还应该有一种方法,使用一个具有4个接口的抽象类(每个操作一个接口)来实现这一点。我相信这就是所谓的战略模式……我的理解正确吗?