class Test { public static void main(String[] args) { Point p1 = new Point(new Number(1), new Number(3)); Point p2 = new Point(new Number(3), new Number(1)); Rectangle r1 = new Rectangle(p1, p2); System.out.println(p1); System.out.println(p2); System.out.println(r1); System.out.println("the area of r1 is " + r1.area()); Point p3 = new Point(new RationalNumber(1,1), new RationalNumber(3,1)); Point p4 = new Point(new RationalNumber(3,1), new RationalNumber(1,1)); Rectangle r2 = new Rectangle(p3, p4); System.out.println(p3); System.out.println(p4); System.out.println(r2); System.out.println("the area of r2 is " + r2.area()); } } class Number { protected double value; public Number(double value) { this.value = value; } public String toString() { return String.valueOf(value); } public double getValue() { return value; } public Number minus(Number other) { return new Number(getValue() - other.getValue()); } public Number times(Number other) { return new Number(getValue() * other.getValue()); } public Number abs() { if (value > 0) { return new Number(-value); } else { return this; } } public String squee() { String s = "squee"; for (int i = 0; i < value; i++) { s += "e"; } return s; } } class Point { protected Number x; protected Number y; public Point(Number x, Number y) { this.x = x; this.y = y; } public Number getX() { return x; } public Number getY() { return y; } public String toString() { return "(" + x.toString() + "," + y.toString() + ")"; } } class Rectangle { protected Point topleft; protected Point bottomright; public Rectangle(Point topleft, Point bottomright) { this.topleft = topleft; this.bottomright = bottomright; } public String toString() { return "[" + topleft.toString() + "," + bottomright.toString() + "]"; } public Number area() { Number length_y = topleft.getY().minus(bottomright.getY()).abs(); Number length_x = bottomright.getX().minus(topleft.getX()).abs(); return length_y.times(length_x); } } /** NEW STUFF HERE **/ class RationalNumber extends Number { protected double numerator; protected double denominator; public RationalNumber(double numerator, double denominator) { super(numerator / denominator); this.numerator = numerator; this.denominator = denominator; } public double getValue() { return numerator / denominator; } public String toString() { return String.valueOf(numerator) + "/" + String.valueOf(denominator); } }