我正在用Java构建一个Challenge24Solver
类。逻辑本身可以工作并找到预期的解决方案(具有任意数量的参数)。无论如何,这部分项目是按照我的预期运作的。
问题来自解决方案表示的问题。可以公平地说,我已经用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”
我理解这可能是因为operator被声明为Operation,但我不明白它为什么不通过标准继承:instance,class,each superclass
如何重新排列脚本以便使用更具体的操作类标记?
答案 0 :(得分: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 "+";
}
}
答案 1 :(得分:3)
您不能在基类中使token
为静态,因为每个所有继承的类都会有一个令牌。您需要将其设为实例变量。您甚至无法将其置于静态方法中,因为Java中的static
方法不可覆盖。
在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;
}
}