fogus (owner)

Revisions

gist: 51091 Download_button fork
public
Public Clone URL: git://gist.github.com/51091.git
Embed All Files: show embed
Java #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Example for http://gist.github.com/51089
 
public class CarTest {
 
    interface CarElement {}
 
    class Wheel implements CarElement {
        private String name;
        Wheel(String name) {
            this.name = name;
        }
        String getName() {
            return this.name;
        }
    }
 
    class Engine implements CarElement {}
 
    class Body implements CarElement {}
 
    class Car {
        CarElement[] elements;
        public CarElement [] getElements() {
            return elements.clone();
        }
        public Car() {
            this.elements = new CarElement[]
              { new Wheel("front left"), new Wheel("front right"),
                new Wheel("back left") , new Wheel("back right"),
                new Body(), new Engine()};
        }
    }
 
    @Multi("visit")
    public void visitP(Wheel wheel, @V("print") String mode) {
        System.out.println("Visiting "+ wheel.getName() + " wheel");
    }
 
    @Multi("visit")
    public void visitP(Engine engine, @V("print") String mode) {
        System.out.println("Visiting engine");
    }
 
    @Multi("visit")
    public void visitP(Body body, @V("print") String mode) {
        System.out.println("Visiting body");
    }
 
    @Multi("visit")
    public void visitP(Car car, @V("print") String mode) {
        System.out.println("\nVisiting car");
        for(CarElement element : car.getElements()) {
            visit(element, mode);
        }
        System.out.println("Visited car");
    }
 
    @Multi("visit")
    public void visitD(Wheel wheel, @V("do") String mode) {
        System.out.println("Kicking my "+ wheel.getName());
    }
 
    @Multi("visit")
    public void visitD(Engine engine, @V("do") String mode) {
        System.out.println("Starting my engine");
    }
 
    @Multi("visit")
    public void visitD(Body body, @V("do") String mode) {
        System.out.println("Moving my body");
    }
 
    @Multi("visit")
    public void visitD(Car car, @V("do") String mode) {
        System.out.println("\nStarting my car");
        for(CarElement element : car.getElements()) {
            visit(element, mode);
        }
        System.out.println("Started car");
    }
 
    protected Multimethod mm = new Multimethod("visit", getClass());
 
    public void visit(Object any, String mode) {
        mm.invoke(this, any, mode);
    }
 
    public void run() {
        Car car = new Car();
        visit(car, "print");
        visit(car, "do");
    }
 
    static public void main(String[] args){
        CarTest t = new CarTest();
        t.run();
    }
}