/* B E S C H R E I B U N G
Klassen:
  Rechteck, Kreis

Abstrakte Klasse:
  GeoForm
  Es gibt in der realen Welt keine allgemeine geometrische Form, 
  GeoForm, sondern nur spezielle Unterarten davon, z.B. ein Rechteck
  oder ein Kreis.
  Es macht also keinen Sinn, ein Exemplar der Klasse "GeoForm" zu bilden.
  Dies realisiert man mit einer abstrakten Klasse, wie z.B. der Klasse
  "GeoForm" (will man davon ein Exemplar erzeugen, ergibt dies einen
  Compilerfehler.
  Eine abstrakte Methode in der Oberklasse, wie z.B. "getVolumen()"
  definiert lediglich den Methodenkopf und drückt damit aus, daß die
  Oberklasse keine Ahnung von der Implemetierung hat und die jeweilige
  Unterklasse sich darum kümmern muss.
  Dies macht in der Methode getVolumen() auch Sinn, da das Volumen
  von der Grundfläche (z.B. Radius bzw. Läneg und Breite) eines 
  geometrischen Objekts abhängt und von den Attributen Radius, 
  bzw. Länge und Breite nur die jeweilige Unterklasse etwas weiss, 
  aber die Oberklasse keine Ahnung davon hat.
  
Vererbung:
  GeoForm ist Oberklasse von Rechteck und Kreis.
*/

public class MainAbstract3{
	public static void main(String[] args) {
		double v1, v2;
		Rechteck r;
		Kreis k;
		r = new Rechteck(2,5);
		k = new Kreis(1);
		v1=r.getVolumen(10);
		v2=k.getVolumen(10);
		System.out.println("v1= "+v1);
		System.out.println("v1= "+v2);		
	}
}

// Klasse Gemetrische Form
abstract class GeoForm {
	public double getVolumen(double pHoehe){
		return(getFlaecheninhalt()*pHoehe);
	}
	
	abstract public double getFlaecheninhalt();
}


class Rechteck extends GeoForm{
	private double laenge;
	private double breite;
	
	public Rechteck(double plaenge, double pbreite){
		setLaenge(plaenge);
		setBreite(pbreite);		
	}

	public void setLaenge(double plaenge){
		laenge = plaenge;
	}

	public void setBreite(double pbreite){
		breite = pbreite;
	}

	public double getLaenge(){
		return(laenge);
	}
	
	public double getBreite(){
		return(breite);
	}

	public double getFlaecheninhalt(){
		return(laenge * breite);		
	}
	
}


class Kreis extends GeoForm{
	private double radius;
	
	public Kreis(double pradius){
		setRadius(pradius);
	}

	public void setRadius(double pradius){
		radius = pradius;
	}

	public double getRadius(){
		return(radius);
	}

	public double getFlaecheninhalt(){
		return(3.14*radius*radius);		
	
	}
}

