4

我正在Challenge24Solver用 Java 构建一个类。逻辑本身起作用并按预期找到解决方案(使用任意数量的参数)。无论如何,项目的那一部分正如我所料。

问题来自解决方案的表示问题。公平地说,我已经用 Python 完成了这个项目,并决定尝试用 Java 作为一种介绍,这可能是问题所在,我也在尝试像 Python 一样做这件事。

以下是我的一些课程:

abstract class Operation { \\ Basic operation class
  static String token;
  abstract public double operate (double x, double y);
}
class AddOp extends Operation {
  static String token = "+";
  public double operate (double x, double y) {
    return x+y;
  }
}
//other operation classes SubOp, MulOp, DivOp
class Challenge24Step { // represents one step in a solution
  Operation operator;
  double x, y; //operands
  double value; //the value of the step (x operator y)
  public Challenge24Step (Operation operator, double x, double y) {
    this.operator = operator;
    // constructor code;
    }
  public String toString () {
    return String.format("%s %s %s = %s", this.x, this.operator.token, this.y,
                         this.value);
  }
}

问题是它仍然从 Operation 类中获取令牌:“null”

我知道这可能是因为运算符被声明为操作,但我不明白为什么它不通过标准继承:实例、类、每个超类

我将如何重新排列脚本以便使用更具体的操作类的标记?

4

2 回答 2

3

静态变量通过引用。您已经定义operator为类型Operation,所以operator.token指的是Operation.token.

我建议为此使用吸气剂:

abstract Operation { \\ Basic operation class
  abstract public double operate (double x, double y);
  abstract public String getToken();
}

class AddOp extends Operation {
  public double operate (double x, double y) {
    return x+y;
  }
  public String getToken() {
      return "+";
  }
}
于 2013-06-17T02:04:51.883 回答
3

您不能token在基类中设置静态,因为这样每个继承的类都会有一个标记。您需要将其设为实例变量。你甚至不能把它放在一个静态方法中,因为staticJava 中的方法是不可覆盖的。

在 Java 中,变量是不可覆盖的。如果继承一个类并添加同名变量,则派生类中的变量将隐藏,而不是覆盖基类中的变量。

要解决此问题,请在基类中创建token一个abstract方法,在派生类中提供一个实现,然后返回所需的值。如果这样做,您可以用接口替换抽象类,因为其中没有变量或实现:

interface Operation { // Basic operation class
    String getToken();
    double operate (double x, double y);
}
class AddOp implements Operation {
    public String getToken() {return "+"; }
    public double operate (double x, double y) {
        return x+y;
    }
}

或者,将其保留在基中未分配,添加一个获取令牌值的构造函数,并将其分配到那里:

abstract class Operation { // Basic operation class
    public final String token;
    abstract public double operate (double x, double y);
    protected Operation(String token) {this.token = token; }
}
class AddOp extends Operation {
    public AddOp() { super("+"); }
    public double operate (double x, double y) {
        return x+y;
    }
}
于 2013-06-17T02:08:50.777 回答