Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过抽象类实现函数指针的Java等价物_Java_Class_Function_Pointers_Abstract - Fatal编程技术网

如何通过抽象类实现函数指针的Java等价物

如何通过抽象类实现函数指针的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

我试图创建一个简单的4函数计算器,使用跳转表而不使用switch case或if/else语句。我知道我可以通过函数指针创建跳转表,但我有点空白。我从程序的加减法部分开始,但我试图掌握要使用的设计/策略。在将方法放入数组时,我也遇到了一个错误,到目前为止,我得到的是:

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个接口的抽象类(每个操作一个接口)来实现这一点。我相信这就是所谓的战略模式……我的理解正确吗?