/* B E S C H R E I B U N G
Klassen:
  Folgende Hierarche wurde implementiert:
  
  G e o F o r m  
    ^        ^                 
    |        |        
  Kreis  Rechteck

   
        
Beschreibung:
1)
Es soll die Benutzung der Polymorphie verwendet werden.
In Java wird late Binding automatisch gemacht.
Es muss nicht wie in C++ das Schlüsselwort "virtual" verwendet werden.
Die Methode zeichneGeoForm() wird bei allen o.g. Klassen verwendet.
zeichneGeoForm() überschreibt somit die Methode der jeweiligen Oberklasse. 
late Binding wird bei der Methode zeichneGeoForm() gemacht. 

Wenn der Programmierer "vergessen" hat, die Methode in einer Unterklasse zu überschreiben,
kann diese Methode nicht mehr die Methode der Oberklasse verdecken.  
Deshalb wird dann die Methode der Oberklasse aufgerufen.
Mache dazu den Test: Kommentiere z.B. die Methode zeichneGeoForm() in der Klasse
Rechteck aus.   
  
2)      
Definition Signatur:
Zwei Methoden haben die gleiche Signatur, wenn folgendes gilt:
  - die Namen der Methoden sind gleich,
  - die Reihenfolgen der Parameter (mit zugehörigen Typen) sind gleich
  Der Return-Typ (der Datentyp der durch Return zurückgegeben wird) muss nicht gleich sein.
  
3)
Überschreiben wird bei gleicher Signatur und gleichem Return-Type
  
4)
Überladen von Methoden funktioniert nur, wenn die Methoden den gleichen Namen, aber 
verschieden Signaturen haben.         

Bemerkungen:
Gemeinsame Eigenschaften der Programme Polymorhie10 -  Polymorhie19
Die polymorphe Variable f ist kein array
*/

public class MainPolymorphie10 {
	public static void main(String[] args) {
		double zufall;
		GeoForm f;
		
		zufall = Math.random();
		if (zufall<0.5){
			f = new Kreis(2);			
		}
		else{ 
			f = new Rechteck(10,20);			
		}
		f.getGezeichneteGeoForm();	
	}
}

// Klasse Gemetrische Form
class GeoForm {
	// Name der geometrischen Form
	private String name;

	public GeoForm(String pname){
		setName(pname);
	}

	public void setName(String pname){
		name = pname;
	}

	public String getName(){
		return(name);
	}

	public void getGezeichneteGeoForm(){
	}
	
}


class Rechteck extends GeoForm{
	private double laenge;
	private double breite;
	
	public Rechteck(double plaenge, double pbreite){
		super("Rechteck");
		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 void getGezeichneteGeoForm(){
		System.out.print("Zeichnet Rechteck mit: "); 
		System.out.print("Laenge= "+getLaenge());
		System.out.print(" und Breite= "+getBreite());		
	}
}


class Kreis extends GeoForm{
	private double radius;
	
	public Kreis(double pradius){
		super("Kreis");
		setRadius(pradius);
	}

	public void setRadius(double pradius){
		radius = pradius;
	}

	public double getRadius(){
		return(radius);
	}

	public void getGezeichneteGeoForm(){
		System.out.println("Zeichnet Kreis mit Radius= "+getRadius());
	}
}

