interface CartesianCoord { public double getX(); public double getY(); public CartesianCoord plus(CartesianCoord other); } interface EuclideanCoord extends CartesianCoord { public double getZ(); public EuclideanCoord plus(EuclideanCoord other); } class Point2D implements CartesianCoord { private final double x; private final double y; public Point2D(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public double getY() { return y; } public CartesianCoord plus(CartesianCoord other) { return new Point2D(this.x + other.getX(), this.y + other.getY()); } public String toString() { return "(" + x + "," + y + ")"; } }
class Point3D extends Point2D implements EuclideanCoord { private final double z; public Point3D(double x, double y, double z) { super(x, y); this.z = z; } public double getZ() { return z; } public EuclideanCoord plus(EuclideanCoord other) { return new Point3D(getX() + other.getX(), getY() + other.getY(), this.z + other.getZ()); } public String toString() { return "(" + getX() + "," + getY() + "," + z + ")"; } } public class AddPoints { public static void main(String[] args) { CartesianCoord p1 = new Point2D(Math.PI, Math.E); EuclideanCoord p2 = new Point3D(-5.1, 3.0, 1); EuclideanCoord p3 = new Point3D(-5.1, 3.0, 1); System.out.println(p1.plus(p2)); System.out.println(p2.plus(p3)); } }