【问题标题】:how to implement Java equivalent of Function Pointers via abstract classes如何通过抽象类实现函数指针的Java等价物
【发布时间】:2011-07-01 17:48:57
【问题描述】:

我正在尝试使用没有 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



    }
}

非常感谢您在正确方向上迈出的任何帮助或想法! 提前致谢!

【问题讨论】:

标签: java class function pointers abstract


【解决方案1】:

您没有任何构造函数可以将任何参数传递给您的子类,我不明白您认为opt1opt2 在没有任何构造函数作为参数的情况下将如何设置。现在这不是正确的 Java 代码。

【讨论】:

  • 是Java代码。看来他所有的课程都是从大写字母开始的,虽然他可能有一个错误(他从来没有接触过他的变量),但肯定是 Java 代码。
  • 他们不接受任何论据
  • 哎呀,我傻了……编辑已经完成,现在要解决初始化具体类的问题。
【解决方案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>

【讨论】:

    【解决方案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.PLUSOperation.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 没有“函数指针”的概念。相反,您只需编写一个接口并编写一个实现该接口的类。在运行时选择要使用的正确类;因此,这是一个“跳转表”,但它隐藏在面向对象编程的语义背后。这称为多态性

    【讨论】:

    • 在阅读有关 java 设计模式的信息时,还应该有一种方法可以使用具有 4 个接口(每个操作一个接口)的抽象类来实现这一点。我相信这被称为策略模式......我理解正确吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    相关资源
    最近更新 更多