samples/visitor/11-cleanversion/src-api1.0/org/apidesign/visitor/Language.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 22:59:00 +0200
changeset 266 47d5f1fe0b03
parent 170 206cdfeefeec
child 327 d7344ad9310d
permissions -rw-r--r--
The final book text is using VisitorXY instead of original VisitorX_Y
jtulach@169
     1
package org.apidesign.visitor;
jtulach@169
     2
jtulach@169
     3
public final class Language {
jtulach@169
     4
    private Language() { }
jtulach@169
     5
    
jtulach@169
     6
    public static abstract class Expression {
jtulach@169
     7
        Expression() {}
jtulach@169
     8
        public abstract void visit(Visitor v);
jtulach@169
     9
    }
jtulach@169
    10
    public static final class Plus extends Expression {
jtulach@169
    11
        private final Expression first;
jtulach@169
    12
        private final Expression second;
jtulach@169
    13
        
jtulach@169
    14
        public Plus(Expression first, Expression second) {
jtulach@169
    15
            this.first = first;
jtulach@169
    16
            this.second = second;
jtulach@169
    17
        }
jtulach@169
    18
        public Expression getFirst() { return first; }
jtulach@169
    19
        public Expression getSecond() { return second; }
jtulach@169
    20
        @Override
jtulach@170
    21
        public void visit(Visitor v) { 
jtulach@266
    22
            if (v instanceof Visitor10) {
jtulach@266
    23
                ((Visitor10)v).visitPlus(this);
jtulach@170
    24
            } else {
jtulach@170
    25
                v.visitUnknown(this);
jtulach@170
    26
            }
jtulach@170
    27
        }
jtulach@169
    28
    }
jtulach@169
    29
    public static final class Number extends Expression {
jtulach@169
    30
        private final int value;
jtulach@169
    31
        public Number(int value) { this.value = value; }
jtulach@169
    32
        public int getValue() { return value; }
jtulach@169
    33
        @Override
jtulach@170
    34
        public void visit(Visitor v) { 
jtulach@266
    35
            if (v instanceof Visitor10) {
jtulach@266
    36
                ((Visitor10)v).visitNumber(this);
jtulach@170
    37
            } else {
jtulach@170
    38
                v.visitUnknown(this);
jtulach@170
    39
            }
jtulach@170
    40
        }
jtulach@169
    41
    }
jtulach@169
    42
jtulach@169
    43
    public interface Visitor {
jtulach@169
    44
        public void visitUnknown(Expression e);
jtulach@170
    45
    }
jtulach@170
    46
    
jtulach@266
    47
    public interface Visitor10 extends Visitor {
jtulach@169
    48
        public void visitPlus(Plus s);
jtulach@169
    49
        public void visitNumber(Number n);
jtulach@169
    50
    }
jtulach@169
    51
}