jtulach@169: package org.apidesign.visitor; jtulach@169: jtulach@327: jtulach@327: // BEGIN: visitor.cleandefinitionofversion jtulach@169: public final class Language { jtulach@169: private Language() { } jtulach@169: jtulach@169: public static abstract class Expression { jtulach@169: Expression() {} jtulach@169: public abstract void visit(Visitor v); jtulach@169: } jtulach@169: public static final class Plus extends Expression { jtulach@169: private final Expression first; jtulach@169: private final Expression second; jtulach@169: jtulach@169: public Plus(Expression first, Expression second) { jtulach@169: this.first = first; jtulach@169: this.second = second; jtulach@169: } jtulach@169: public Expression getFirst() { return first; } jtulach@169: public Expression getSecond() { return second; } jtulach@169: @Override jtulach@170: public void visit(Visitor v) { jtulach@266: if (v instanceof Visitor10) { jtulach@266: ((Visitor10)v).visitPlus(this); jtulach@170: } else { jtulach@170: v.visitUnknown(this); jtulach@170: } jtulach@170: } jtulach@169: } jtulach@169: public static final class Number extends Expression { jtulach@169: private final int value; jtulach@169: public Number(int value) { this.value = value; } jtulach@169: public int getValue() { return value; } jtulach@169: @Override jtulach@170: public void visit(Visitor v) { jtulach@266: if (v instanceof Visitor10) { jtulach@266: ((Visitor10)v).visitNumber(this); jtulach@170: } else { jtulach@170: v.visitUnknown(this); jtulach@170: } jtulach@170: } jtulach@169: } jtulach@169: jtulach@169: public interface Visitor { jtulach@169: public void visitUnknown(Expression e); jtulach@170: } jtulach@170: jtulach@266: public interface Visitor10 extends Visitor { jtulach@169: public void visitPlus(Plus s); jtulach@169: public void visitNumber(Number n); jtulach@169: } jtulach@169: } jtulach@327: // END: visitor.cleandefinitionofversion