Contributed by Chris Rathman
interface Shape { public void moveTo(int newx, int newy); public void rMoveTo(int deltax, int deltay); public void draw(); } |
class Rectangle implements Shape { private int width; private int height; // constructor public Rectangle(int newwidth, int newheight) { setWidth(newwidth); setHeight(newheight); } // accessors for the width & height public int getWidth() { return width; } public int getHeight() { return height; } public void setWidth(int newwidth) { width = newwidth; } public void setHeight(int newheight) { height = newheight; } // draw the rectangle public void draw() { System.out.println("Drawing a Rectangle: Width " + getWidth() + ", Height " + getHeight()); } } |
class Circle implements Shape { private int radius; // constructor public Circle(int newradius) { setRadius(newradius); } // accessors for the radius public int getRadius() { return radius; } public void setRadius(int newradius) { radius = newradius; } // draw the circle public void draw() { System.out.println("Drawing a Circle: Radius " + getRadius()); } } |
aspect PositionableShape { // properties for shape interface private int Shape.x = 0; private int Shape.y = 0; // circle constructor with position public Circle.new(int newx, int newy, int newradius) { this(newradius); moveTo(newx, newy); } // rectangle constructor with position public Rectangle.new(int newx, int newy, int newwidth, int newheight) { this(newwidth, newheight); moveTo(newx, newy); } // accessors for x & y public int Shape.getX() { return x; } public int Shape.getY() { return y; } public void Shape.setX(int newx) { x = newx; } public void Shape.setY(int newy) { y = newy; } // move the x & y position public void Shape.moveTo(int newx, int newy) { setX(newx); setY(newy); } public void Shape.rMoveTo(int deltax, int deltay) { moveTo(getX() + deltax, getY() + deltay); } // position the shape for drawing pointcut draw(Shape self): target(self) && call(void Shape.draw()); before(Shape self): draw(self) { System.out.print("At (" + self.getX() + ", " + self.getY() + ") "); } } |
class Polymorph { public static void main(String argv[]) { // create some shape instances Shape scribble[] = new Shape[2]; scribble[0] = new Rectangle(10, 20, 5, 6); scribble[1] = new Circle(15, 25, 8); // iterate through the list and handle shapes polymorphically for (int i = 0; i < scribble.length; i++) { scribble[i].draw(); scribble[i].rMoveTo(100, 100); scribble[i].draw(); } // call a rectangle specific function Rectangle arect = new Rectangle(0, 0, 15, 15); arect.setWidth(30); arect.draw(); } } |
Shape.java Rectangle.java Circle.java PositionableShape.java Polymorph.java |
At (10, 20) Drawing a Rectangle: Width 5, Height 6 At (110, 120) Drawing a Rectangle: Width 5, Height 6 At (15, 25) Drawing a Circle: Radius 8 At (115, 125) Drawing a Circle: Radius 8 At (0, 0) Drawing a Rectangle: Width 30, Height 15 |