我正在建造一个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);
}
}
问题是它仍然从操作类获取令牌:“null”
我知道这可能是因为运算符被声明为操作,但我不明白为什么它不经过标准继承:实例、类、每个超类
我将如何重新排列脚本以便使用更具体的操作类的标记?
你不能使token
static 在基类中,因为这样每个继承的类都会有一个标记。您需要将其设为实例变量。你甚至不能把它放在静态方法中,因为static
Java 中的方法是不可重写的。
在 Java 中,变量是不可重写的。如果继承一个类并添加同名变量,则派生类中的变量将hide, not override基类中的一个。
要解决此问题,请使token
an 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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)