我在理解Java中的赋值时遇到了问题。基本上我们正在写一个翻译,应该很简单。我已经两年没用Java了,所以几乎所有的知识都被遗忘了。
基本上,我需要创建的类看起来像theese。
public interface Handler {
void interpret();
}
public class Program implements Handler{
@Override
public void interpret() {
// write the interpret logic here
}
}
public class Stmt implements Handler {
@Override
public void interpret() {
// write the interpret logic here
}
}
public class Move extends Stmt implements Handler {
public void interpret() {
// write the interpret logic here
}
}
public class Right extends Move implements Handler {
public Right( Exp i )
{
interpret();
}
public void interpret() {
// write the interpret logic here
}
}
测试程序需要像这样:
Program pro_inst = new Program();
pro_inst.addStmt(new Start(new Exp(new Numbers(23)), new Exp(new Numbers(
pro_inst.addStmt(new Forward(new Exp(new Numbers(15)) ) );
... ...
pro_inst.addStmt( new Stop());
... ..
我愚弄了几个小时,但我努力奋斗。例如,我在哪里分配变量以及如何使用解释器编辑它们?我看到我在测试程序中一直在创建新对象,我应该返回值还是什么?我需要在某处有一个变量x和y,它们都需要由解释器编辑。
谢谢你,如果你读到目前为止!
答案 0 :(得分:0)
听起来你需要了解范围的想法。
您的程序类正在添加不同的操作(启动,停止,移动等等),每个操作都由“处理程序”封装。
每个处理程序都有所作为。由您来定义解释代码块。
因此,要使程序正常工作,必须将变量添加到Program类中,并在explain()方法中修改这些变量。
答案 1 :(得分:0)
不确定你的意思。但是当您实例化任何对象时,您应该使用构造函数 -
将数据存储在对象中public class Numbers extends Expr{
double value = 0;
public Numbers(double x){
this.value = x;
}
public Object evaluate(){
return value;
}
}
public class Start extends Stmt{
Vector<Expr> expressions = new Vector<Expr>();
public Stmt(Expr x1, Expr x2){
expressions.add(x1);
expressions.add(x2);
}
public void interpret(){
// do something with your list of 'expressions'
}
}
在执行测试程序时实例化的对象应该存储在构造函数中传递的值,如上所述。
例如,如果你想要一个作业,那么应该构建这样的东西
class Assignment extends Stmt{
String lhs;
Expr rhs;
public Assignment(String lhs, Expr rhs){
this.rhs=rhs; this.lhs=lhs;
}
public void interpret(Map context){
context.put(lhs, rhs.evaluate());
}
}
class VariableExpr extends Expr{
String name;
public VariableExpr(String name){
this.name=name;
}
public Object evaluate(Map context){
return context.get(name);
}
}
在解释时,您需要为每个语句都有一个上下文。
如果您想要一个全局上下文,只需从空白HashMap
开始,并将相同的地图传递给interpret
方法的每次调用。
很抱歉,如果这不是您的要求!