package Main3;

/* Version 3: No class inheritance, code shared through 
 * composition and delegation */

interface Displaceable {
    public double getX ();
    public double getY ();
    public void move (double dx, double dy);
}

interface Area {
    public double getArea ();
}

interface Shape extends Displaceable, Area {
	Rectangle getBoundingBox();
}

class Point implements Displaceable {
	private double x;
	private double y;
	public Point(double initX, double initY) {
		x = initX;
		y = initY;
	}
	public double getX () {
    	return x;
    }
    public double getY () {
    	return y;
    }
    public void move (double dx, double dy) {
    	x = x + dx;
    	y = y + dy;
    }
}

class Circle implements Shape {
    private double r;
    private Point p;  // center of the circle
    public Circle (double initX, double initY, 
		           double initR) {
    	p = new Point(initX, initY);
    	r = initR;
    }
    public double getX () {
    	return p.getX();
    }
    public double getY () {
    	return p.getY();
    }
    public void move(double dx, double dy) {
    	p.move(dx, dy);
    }
    public double getArea () { 
    	return 3.14159 * r * r; 
    }
    public double getRadius () {
    	return r;
    }
    public Rectangle getBoundingBox () {
    	return new Rectangle(p.getX()-r,p.getY()-r,p.getX()+r,p.getY()+r);
    }
}

class Rectangle implements Shape {
	private Point p;  // upper left hand corner
    private double w, h;   // width and height
    public Rectangle (double initX, double initY,
		              double initW, double initH) {
    	p = new Point(initX, initY);
    	w = initW;
    	h = initH;
    }
    public double getX () {
    	return p.getX();
    }
    public double getY () {
    	return p.getY();
    }
    public void move(double dx, double dy) {
    	p.move(dx, dy);
    }
    public double getArea () {
    	return w * h;
    }
    public double getWidth () {
    	return w;
    }
    public double getHeight () {
    	return h;
    }
    public Rectangle getBoundingBox () {
    	return new Rectangle(getX(),getY(),w,h);
    }
}


class Main {
  public static void main (String[] args) {
      Area a1 = new Circle(0.0,0.0,3.0);  
      Shape s2 = new Rectangle(0.0,0.0,3.0,4.0);
      System.out.printf("a1.getArea() = %s\n", a1.getArea());
      System.out.printf("s2.getArea() = %s\n", s2.getArea());
  }
}
