    interface Forme {
      String toStringAire();
      double getAire();
    }

    abstract class AbstractForme implements Forme {
      double largeur, hauteur;
      AbstractForme(double l, double h) {
	largeur = l;
	hauteur = h;
      }
      public String toStringAire() {
	return getNom() + ": aire = " + getAire();
      }
      abstract String getNom();
    }

    class Rectangle extends AbstractForme {
      Rectangle(double l, double h) {
	super(l,h);
      }
      public double getAire() {
	return largeur*hauteur;
      }
      String getNom() {
	return "Rectangle";
      }
    }

    class Ellipse extends AbstractForme {
      Ellipse(double l, double h) {
	super(l,h);
      }
      public double getAire() {
	return largeur*hauteur*Math.PI/4;
      }
      String getNom() {
	return "Ellipse";
      }
    }

    class Triangle extends AbstractForme {
      Triangle(double l, double h) {
	super(l,h);
      }
      public double getAire() {
	return largeur*hauteur/2;
      }
      String getNom() {
	return "Triangle";
      }
    }

    class Maison extends AbstractForme {
      Maison(double l, double h) {
	super(l,h);
      }
      public double getAire() {
	return 3*largeur*hauteur/4;
      }
      String getNom() {
	return "Maison";
      }
    }

    class TestIForme {
      static Forme readForme() {
	char type = Keyboard.readChar();
	if (type == 'q') return null;
	double largeur = Keyboard.readInt();
	double hauteur = Keyboard.readInt();
	switch (type) {
	case 'r': return new Rectangle(largeur, hauteur);
	case 'e': return new Ellipse(largeur, hauteur);
	case 't': return new Triangle(largeur, hauteur);
	case 'm': return new Maison(largeur, hauteur);
	default: return null;
	}
      }

      public static void main(String[] args) {
	System.out.println("Donnez le type, la largeur puis la hauteur");
	for(;;) {
	  Forme f = readForme();
	  if (f == null) 
	    break;
	  System.out.println(f.toStringAire());
	}
	System.out.println("Bye");
      }
    }

