Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
turtle编程Java,将各种类作为一个参数移交,并检查它是哪个类_Java - Fatal编程技术网

turtle编程Java,将各种类作为一个参数移交,并检查它是哪个类

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

我正试图按照访问者模式用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 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对象!