Contributed by Chris Rathman
(use goo) ;; define the shape class (dc <shape> (<any>)) ;; define the shape class properties (dp x (<shape> => <int>) 0) (dp y (<shape> => <int>) 0) ;; accessors for x & y (dm get-x (self|<shape>) (x self)) (dm get-y (self|<shape>) (y self)) (dm set-x (self|<shape> new-x|<int>) (set (x self) new-x)) (dm set-y (self|<shape> new-y|<int>) (set (y self) new-y)) ;; move the x & y coordinates (dm move-to (self|<shape> new-x|<int> new-y|<int>) (set-x self new-x) (set-y self new-y)) (dm r-move-to (self|<shape> delta-x|<int> delta-y|<int>) (move-to self (+ (get-x self) delta-x) (+ (get-y self) delta-y))) ;; draw the shape - abstract (dg draw (self|<shape>)) ;; export the class and methods (export <shape> x y get-x get-y set-x set-y move-to r-move-to draw) |
(use goo) (use shape) ;; define the rectangle class (dc <rectangle> (<shape>)) ;; define the rectangle class properties (dp width (<rectangle> => <int>) 0) (dp height (<rectangle> => <int>) 0) ;; accessors for width & height (dm get-width (self|<rectangle>) (width self)) (dm get-height (self|<rectangle>) (height self)) (dm set-width (self|<rectangle> new-width|<int>) (set (width self) new-width)) (dm set-height (self|<rectangle> new-height|<int>) (set (height self) new-height)) ;; draw the rectangle (dm draw (self|<rectangle>) (msg out "Drawing a Rectangle at:(%=,%=) width %=, height %=\n" (get-x self) (get-y self) (get-width self) (get-height self))) ;; export the class and methods (export <rectangle> width height get-width get-height set-width set-height draw) |
(use goo) (use shape) ;; define the circle class (dc <circle> (<shape>)) ;; define the circle class properties (dp radius (<circle> => <int>) 0) ;; accessors for radius (dm get-radius (self|<circle>) (radius self)) (dm set-radius (self|<circle> new-radius|<int>) (set (radius self) new-radius)) ;; draw the circle (dm draw (self|<circle>) (msg out "Drawing a Circle at:(%=,%=) radius %=\n" (get-x self) (get-y self) (get-radius self))) ;; export the class and methods (export <circle> radius get-radius set-radius draw) |
(use goo) (use shape) (use circle) (use rectangle) ;; function to test the polymorphism (df polymorph () ;; create a collection containing various shape instances (dv scribble (fab <vec> 1)) (set (elt scribble 0) (new <rectangle> x 10 y 20 width 5 height 6)) (set (elt scribble 1) (new <circle> x 15 y 25 radius 8)) ;; iterate through the list of shapes and handle polymorphically (do (fun (each) (draw each) (r-move-to each 100 100) (draw each)) scribble) ;; create a rectangle instance (def arect (new <rectangle> x 0 y 0 width 15 height 15)) ;; call a rectangle specific function (set-width arect 30) (draw arect)) ;; export the function for further use (export polymorph) |
(use polymorph) (polymorph) |
Drawing a Rectangle at:(10,20) width 5, height 6 Drawing a Rectangle at:(110,120) width 5, height 6 Drawing a Circle at:(15,25) radius 8 Drawing a Circle at:(115,125) radius 8 Drawing a Rectangle at:(0,0) width 30, height 15 |