Interfaces in Karel

Interfaces are named collections of method signatures.

import java.lang.Math;

// Here's a basic interface for geometric shapes.
interface Geometry {
    double area();
    double perim();
}

// For our example we'll implement this interface on
// Rectangle and Circle classes.
class Rectangle implements Geometry {
    double width, height;

    Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    // To implement an interface in Java, we need to
    // implement all the methods in the interface.
    @Override
    public double area() {
        return width * height;
    }

    @Override
    public double perim() {
        return 2 * width + 2 * height;
    }

    @Override
    public String toString() {
        return "{" + width + " " + height + "}";
    }
}

class Circle implements Geometry {
    double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    // The implementation for Circle.
    @Override
    public double area() {
        return Math.PI * radius * radius;
    }

    @Override
    public double perim() {
        return 2 * Math.PI * radius;
    }

    @Override
    public String toString() {
        return "{" + radius + "}";
    }
}

public class Interfaces {
    // If a variable has an interface type, then we can call
    // methods that are in the named interface. Here's a
    // generic measure method taking advantage of this
    // to work on any Geometry.
    public static void measure(Geometry g) {
        System.out.println(g);
        System.out.println(g.area());
        System.out.println(g.perim());
    }

    public static void main(String[] args) {
        Rectangle r = new Rectangle(3, 4);
        Circle c = new Circle(5);

        // The Circle and Rectangle classes both
        // implement the Geometry interface so we can use
        // instances of these classes as arguments to measure.
        measure(r);
        measure(c);
    }
}

To run the program, compile it and then use java to execute:

$ javac Interfaces.java
$ java Interfaces
{3.0 4.0}
12.0
14.0
{5.0}
78.53981633974483
31.41592653589793

To learn more about Java’s interfaces, check out the official Java documentation on interfaces.