import java.util.Arrays; abstract class Shape { public abstract double getArea( ); public abstract double getPerimeter( ); public double getSemiPerimeter( ) { return getPerimeter( ) / 2.0; } } interface Stretchable // interface == abstract class no implementation { public void stretch( ); public abstract void stretch( double factor ); } 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 Rectangle extends Shape implements Stretchable { public Rectangle( double len, double wid ) { length = len; width = wid; } public void stretch( ) { stretch( 2.0 ); } public void stretch( double factor ) { length *= factor; } public double getArea( ) { return length * width; } public double getPerimeter( ) { return 2 * ( length + width ); } public String toString( ) { return "Rectangle with dimensions " + length + "*" + width; } private double length; private double width; } class Ellipse extends Shape implements Stretchable { public Ellipse( double len ,double wid ) { length = len; width = wid; } public void stretch( ) { stretch( 2.0 ); } 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 String toString( ) { return "Ellipse with dimensions " + length + "*" + width; } private double length; private double width; } class Circle extends Shape implements Comparable { public static final double PI = 3.14; public Circle( double r ) { radius = r; } public int compareTo( Circle other ) { if( radius < other.radius ) return -1; else if( radius == other.radius ) return 0; else return +1; } 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, Object [ ] arr ) { System.out.println( msg ); for( int i = 0; i < arr.length; i++ ) System.out.println( "arr[" + i + "]=" + arr[ i ] ); } public static double totalArea( Shape [ ] arr ) { double total = 0.0; for( Shape s : arr ) total += s.getArea( ); return total; } public static void stretchAll( Stretchable [ ] arr ) { for( Stretchable r : arr ) r.stretch( ); } // Not a great plan to start with public static void stretchAllShapes( Shape [ ] arr ) { for( Shape s : arr ) { if( s instanceof Stretchable ) { Stretchable tmp = (Stretchable) s; tmp.stretch( ); } } } public static void main( String [ ] args ) { Square [ ] arr1 = { new Square( 3 ), new Square( 4 ) }; printArray( "arr1:", arr1 ); System.out.println( "Total area: " + totalArea( arr1 ) ); Circle [ ] arr2 = { new Circle( 1 ), new Circle( 4 ), new Circle( 2 ) }; printArray( "arr2: ", arr2 ); Arrays.sort( arr2 ); printArray( "arr2: ", arr2 ); System.out.println( "Total area: " + totalArea( arr2 ) ); Rectangle [ ] arr3 = { new Rectangle( 1, 4 ), new Rectangle( 2, 5 ) }; printArray( "arr3: ", arr3 ); stretchAll( arr3 ); printArray( "arr3: ", arr3 ); System.out.println( "Total area: " + totalArea( arr3 ) ); Ellipse [ ] arr4 = { new Ellipse( 1, 4 ), new Ellipse( 2, 5 ) }; printArray( "arr4: ", arr4 ); stretchAll( arr4 ); printArray( "arr4: ", arr4 ); System.out.println( "Total area: " + totalArea( arr4 ) ); Shape [ ] arr5 = { new Circle( 1 ), new Square( 1 ), new Rectangle( 3, 4 ), new Ellipse( 5, 3 ) }; printArray( "arr5: ", arr5 ); stretchAllShapes( arr5 ); printArray( "arr5: ", arr5 ); System.out.println( "Total area: " + totalArea( arr5 ) ); } }