turtle编程Java,将各种类作为一个参数移交,并检查它是哪个类
我正试图按照访问者模式用Java编写一个Turtle程序。 因此,我有访客:turtle编程Java,将各种类作为一个参数移交,并检查它是哪个类,java,Java,我正试图按照访问者模式用Java编写一个Turtle程序。 因此,我有访客: public interface Visitor { void visit(Go go); void visit(Turn turn); void visit(Call call); void visit(PenDown pendown); void visit(PenUp penup); void visit(Repeat repeat); void visit(Sequence sequence); void v
public interface Visitor {
void visit(Go go);
void visit(Turn turn);
void visit(Call call);
void visit(PenDown pendown);
void visit(PenUp penup);
void visit(Repeat repeat);
void visit(Sequence sequence);
void visit(Subroutine subroutine);
}
以及应实现一些访问方法的抽象访问者:
public abstract class AbstractVisitor implements Visitor {
protected Turtle turtle;
protected AbstractVisitor(Turtle turtle){
this.turtle = turtle;
}
public AbstractVisitor() {
}
public void visit(Turn turn){
turtle.turn(turn.w);
}
public void visit(Sequence sequence){
}
public void visit(Repeat repeat) {
int d = repeat.rep;
for(int i = 0; i<repeat.rep; i++){
for(int s = 0; s<repeat.d.size(); s++){
}
}
}
public void visit(Subroutine subroutine) {
}
public void visit(Call call) {
}
public void visit(PenDown penDown) {
}
public void visit(PenUp penUp) {
}
}
喜欢上课吗
public class Go implements Stmt {
公共双区
public Go(double d){
if(d<0 ) {
throw new IllegalArgumentException("Die Strecke muss positiv sein");
} this.dist = d;
}
public void accept(Visitor v) {
}
公共围棋(双d){
如果(d我没有完全理解你的问题!但是如果你的问题是:
你有一个接口
public interface Stmt {
void accept(Visitor v);
}
您有两个类实现这个接口,每个类都有一个不同的accept方法主体
public class X implements Stmt{
public void accept(Visitor v) {
//code
}
}
及
据我所知,你的问题是:
如果调用accept()方法,我如何知道将使用哪个主体!是来自X类的accept()还是来自Y类的accept()
答复:
这取决于您的主应用程序,因为您知道无法实例化接口!
因此,这取决于您实例化了哪个类!
例如,您将拥有:
Stmt var = new X();
对于这一个,var.accept()将从X类调用主体!我不完全理解您的问题!但是如果您的问题是:
你有一个接口
public interface Stmt {
void accept(Visitor v);
}
您有两个类实现这个接口,每个类都有一个不同的accept方法主体
public class X implements Stmt{
public void accept(Visitor v) {
//code
}
}
及
据我所知,你的问题是:
如果调用accept()方法,我如何知道将使用哪个主体!是来自X类的accept()还是来自Y类的accept()
答复:
这取决于您的主应用程序,因为您知道无法实例化接口!
因此,这取决于您实例化了哪个类!
例如,您将拥有:
Stmt var = new X();
对于这一个,var.accept()将从X类调用主体!我理解这一点,但我有一个问题,我的类Repeat将像这个新的Repeat(4,new Go(50),new Turn(90))一样创建,我需要检查是否有一个新的Go()或new Turn()因此,我可以在abstractVisitor中调用正确的方法在本例中,您将首先创建两个对象:新建Go()对象和新建Turn()对象,然后使用这两个对象创建新的Repeat(…)!之后,您调用了accept(visitor)(假设您实例了abstractVisitor对象!)因此编译器将使用这个方法visit(Repeat Repeat),因为您使用了v.visit(this)并且“this”引用了一个Repeat对象!是的,我想使用visit(Repeat Repeat),但是在这个函数中,我需要获取new Repeat(4,new Go(50),new Turn(90))的参数来调用visit(Go-Go)和visit(Turn-Turn)啊,现在我明白你的意思了,你想要得到创建的对象(new Go())和(new Turn()),因为:只需调用:(假设Repeat obj=new Repeat(4,new Go(50),new Turn(90)),这样你就可以检索从(Go)obj.d[0]和(Turn)obj.d[1]创建的Go对象。别忘了添加一个cast(Go)和(Turn)强制编译器将其理解为Go&Turn对象!我理解这一点,但我有一个问题,我的类Repeat将像这个新Repeat(4,new Go(50),new Turn(90))一样创建,我需要检查是否有一个新的Go()或new Turn()因此,我可以在abstractVisitor中调用正确的方法在本例中,您将首先创建两个对象:新建Go()对象和新建Turn()对象,然后使用这两个对象创建新的Repeat(…)!之后,您调用了accept(visitor)(假设您实例了abstractVisitor对象!)因此编译器将使用这个方法visit(Repeat Repeat),因为您使用了v.visit(this)并且“this”引用了一个Repeat对象!是的,我想使用visit(Repeat Repeat),但是在这个函数中,我需要获取new Repeat(4,new Go(50),new Turn(90))的参数来调用visit(Go-Go)和visit(Turn-Turn)啊,现在我明白你的意思了,你想要得到创建的对象(new Go())和(new Turn()),因为:只需调用:(假设Repeat obj=new Repeat(4,new Go(50),new Turn(90)),这样你就可以检索从(Go)obj.d[0]和(Turn)obj.d[1]创建的Go对象。别忘了添加一个cast(Go)和(Turn)强制编译器将其理解为Go&Turn对象!