/* B E S C H R E I B U N G
Klassen:
  Zylinder und Quader 

Abstrakte Klasse: PhysikalischerKoerper
  Es gibt in der realen Welt keinen allgemeinen, unspezifizierten
  physikalischen Körper, sondern nur spezielle Unterarten eines 
  physikalischen Körpers, z.B. einen Zylinder oder 
  einen Quader.
  Es macht also keinen Sinn, ein Exemplar der Klasse "Koerper" zu 
  bilden.
  Dies realisiert man mit einer abstrakten Klasse, wie z.B. der Klasse
  "Koerper" (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 Art des physikalischer Körpers (z.B. Zylinder, 
  Quader) abhängt, und von den Attributen "laenge", 
  "breite", "hoehe" und "radius" nur die jeweilige Unterklasse etwas weiß, 
  aber die Oberklasse keine Ahnung davon hat.
  
Vererbung:
  Koerper ist Oberklasse von Zylinder und Quader.
*/

public class MainAbstract5{
	public static void main(String[] args) {
		double masse, mondgew, energie, wievielfache;
		
		Quader myz;

		myz=new Quader(1, 1, 10);
		myz.setDichte(2);
		masse = myz.getMasse();
		mondgew=myz.getGewichtAufMond();
		energie=myz.getKinetischeEnergie(10);
		wievielfache=myz.getWievielfacheGewicht(10, 2);
		
		System.out.println("masse= "+masse);
		System.out.println("mondgew= "+mondgew);		
		System.out.println("energie= "+energie);
		System.out.println("wievielfache= "+wievielfache);		
	}
}

abstract class Koerper {
	private double dichte; 

	public void setDichte(double pDichte){
		dichte=pDichte;
	}

	public double getDichte(){
		return(dichte);
	}
		
	// Masse des Körpers 
	public double getMasse(){
		return(dichte*getVolumen());
	}

	// Gewicht des Körpers auf dem Mond
	public double getGewichtAufMond(){
		return(getMasse()/6.0);
	}
	
	// kinetische Energie bei der Geschwindigkeit v
	public double getKinetischeEnergie(double v){
		return(0.5*getMasse()*v*v);
	}

	// wievielfache Körpergewicht
	public double getWievielfacheGewicht(double v, double r){
		return(v*v/r);
	}
	
	
	abstract public double getVolumen();
}


class Zylinder extends Koerper{
	private double radius;
	private double hoehe;	

	public Zylinder(double pRadius, double pHoehe){
		radius=pRadius;
		hoehe=pHoehe;
	}
	
	public double getVolumen(){
		return 3.14*radius*radius*hoehe;
	}
}


class Quader extends Koerper{
	private double laenge;
	private double breite;
	private double hoehe;	

	public Quader(double pLaenge, double pBreite, double pHoehe){
		laenge=pLaenge;
		breite=pBreite;
		hoehe=pHoehe;	
	}
	
	public double getVolumen(){
		return(laenge*breite*hoehe);
	}
	
}








