abstract class Shape { public abstract double getArea( ); public abstract double getPerimeter( ); public double getSemiPerimeter( ) { return getPerimeter( ) / 2; } } abstract class StretchableShape extends Shape { public abstract void stretch( double factor ); } class Rectangle extends StretchableShape { public Rectangle( double len, double wid ) { length = len; width = wid; } // makes length = length * factor public void stretch( double factor ) { length *= factor; } public double getArea( ) { return length * width; } public double getPerimeter( ) { return 2 * ( length + width ); } public double getLength( ) { return length; } public double getWidth( ) { return width; } public String toString( ) { return "Rectangle " + length + "*" + width; } private double length; private double width; } class Ellipse extends StretchableShape { public Ellipse( double len, double wid ) { length = len; width = wid; } // makes length = length * factor public void stretch( double factor ) { length *= factor; } public double getArea( ) { return Circle.PI / 4 * length * width; } public double getPerimeter( ) { return Circle.PI / 2 * ( length + width ); } public double getLength( ) { return length; } public double getWidth( ) { return width; } public String toString( ) { return "Ellipse " + length + "*" + width; } private double length; private double width; } class Square extends Shape { public Square( double s ) { side = s; } public double getArea( ) { return side * side; } public double getPerimeter( ) { return 4 * side; } public String toString( ) { return "Square with side " + side; } private double side; } class Circle extends Shape { public static final double PI = 3.14; public Circle( double r ) { radius = r; } public double getPerimeter( ) { return 2 * PI * radius; } public double getArea( ) { return PI * radius * radius; } public String toString( ) { return "Circle with radius " + radius; } private double radius; } public class Day12 { public static void printArray( String msg, Shape [ ] arr ) { System.out.print( msg + " [" ); for( Shape s : arr ) System.out.print( " " + s ); System.out.println( " ]" ); } public static double totalArea( Shape [ ] arr ) { double total = 0.0; for( Shape s : arr ) total += s.getArea( ); return total; } public static void stretchAll( StretchableShape [ ] arr, double factor ) { for( StretchableShape r : arr ) r.stretch( factor ); } public static void main( String [ ] args ) { Square [ ] sarr = { new Square( 3 ), new Square( 2 ) } ; printArray( "sarr: ", sarr ); System.out.println( "Total area of sarr is: " + totalArea( sarr ) ); Circle [ ] carr = { new Circle( 2 ), new Circle( 1 ) }; printArray( "carr: ", carr ); System.out.println( "Total area of carr is: " + totalArea( carr ) ); Shape [ ] sharr = { new Square( 3 ), new Ellipse( 4, 4 ), new Circle( 2 ), new Circle( 1 ), new Square( 2 ), new Rectangle( 5, 5 ) }; printArray( "sharr: ", sharr ); System.out.println( "Total area of sharr is: " + totalArea( sharr ) ); Rectangle [ ] rarr = { new Rectangle( 6, 4 ), new Rectangle( 7, 1 ) }; Ellipse [ ] earr = { new Ellipse( 5, 3 ), new Ellipse( 2, 1 ) } ; printArray( "rarr: ", rarr ); printArray( "earr: ", earr ); stretchAll( rarr, 2.0 ); stretchAll( earr, 2.0 ); printArray( "rarr: ", rarr ); printArray( "earr: ", earr ); } }