2.8  Example: Definition of the classes that represent the union of shapes

A Shape is on of:

/*
                        +--------+                        
                        | AShape |                        
                        +--------+                        
                        +--------+                        
                           / \                            
                           ---                            
                            |                             
         ---------------------------------------          
         |                 |                   |          
  +-------------+    +------------+    +---------------+  
  | Circle      |    | Rect       |    | Dot           |  
  +-------------+    +------------+    +---------------+  
  | Posn center |-+  | Posn nw    |-+  | Posn location |-+  
  | int radius  | |  | int width  | |  +---------------+ |
  +-------------+ |  | int height | |                    |
    +-------+     |  +------------+ |                    |
    | Posn  |<----+-----------------+--------------------+
    +-------+
    | int x |
    | int y |
    +-------+                                                         
*/

// to represent one point on  a canvas
class Posn {
  int x;
  int y;

  Posn(int x, int y) {
    this.x = x;
    this.y = y;
  }
}

// to represent geometric shapes
abstract class AShape {
}

// to represent a circle
class Circle extends AShape {
  Posn center;
  int radius;

  Circle(Posn center, int radius) {
    this.center = center;
    this.radius = radius;
  }
}

// to represent a rectangle
class Rect extends AShape {
  Posn nw;
  int width;
  int height;

  Rect(Posn nw, int width, int height) {
    this.nw = nw;
    this.width = width;
    this.height = height;
  }
}

// to represent a dot
class Dot extends AShape {
  Posn location;

  Dot(Posn location) {
    this.location = location;
  }
}

/* Interactions:
Examples of the use of the constructors for the classes representing shapes
Circle c1 = new Circle(new Posn(10, 20), 15);
Circle c2 = new Circle(new Posn(40, 20), 10);
Rect r1   = new Rect(new Posn(10, 20), 20, 40);
Rect r2   = new Rect(new Posn(40, 20), 50, 10);
Dot d1    = new Dot(new Posn(10, 20));
Dot d2    = new Dot(new Posn(40, 20));

Examples of the use of field selectors for sub-classes of AShape

c1.center      -- expected: new Posn(10, 20)
c1.center.x    -- expected: 10
c1.center.y    -- expected: 20
c1.radius      -- expected: 15

c2.center      -- expected: new Posn(40, 20)
c1.center.x    -- expected: 40
c2.center.y    -- expected: 20
c2.radius      -- expected: 10

r1.nw          -- expected: new Posn(10, 20)
r1.nw.x        -- expected: 10
r1.nw.y        -- expected: 20
r1.width       -- expected: 20
r1.height      -- expected: 40

r2.nw          -- expected: new Posn(40, 20)
r2.nw.x        -- expected: 40
r2.nw.y        -- expected: 20
r2.width       -- expected: 50
r2.height      -- expected: 10

d1.location    -- expected: new Posn(10, 20)
d1.location.x  -- expected: 10
d1.location.y  -- expected: 20

d2.location    -- expected: new Posn(40, 20)
d2.location.x  -- expected: 40
d2.location.y  -- expected: 20
*/