/* B E S C H R E I B U N G
Klassen:
  Kuh, Henne, Nutztier, Interface AllAttributes

Schaubild (implementierte Hierarche)

     (abstract)            (Interface)  
   N u t z t i e r        AllAttributes1
      ^        ^             ^     ^           
      |        |             |     |
      |        |             |     |
      |        |             |     |
     Kuh     Henne           |     |
      |        |             |     |
      |        |             |     |
      |        |-------------|     |
      |                            |
      |                            |
      |-----------------------------        

Vererbung:
  Nutztier ist Oberklasse von Kuh und Henne.

Interface:
   AllAttributes1
   Jede Klasse sollte - zumindest zu Testzwecken - jeweils die Methode
   printAllAttributes1() enthalten, mit der die Attribute einer Klasse
   auf dem Bildschirm ausgegeben werden. Man kann nun diese Methode 
   in eine Klasse AllAttributes1 stecken und von dieser Klasse die Methode
   printAllAttributes1() erben. Da es in Java keine Mehrfachverebung gibt, 
   (konkret: wenn z.B. Kuh Unterklasse von Nutztier ist, kann Kuh nicht 
   auch noch Unterklasse von der Klasse AllAttributes1 sein), hat man sich
   den Trick mit der Interfaces einfallen lassen. Eine Klasse kann beliebig
   viele Interfaces "einbinden" (mit dem Wort implement). Ein Interface ist
   so etwas ähnliches wie eine Klasse, nur dass dort von den Methoden nur 
   die Methodenköpfe (mit den Parametern) angegeben werden dürfen.
   Die komplette Methode muß dann in der Klasse implementiert werden,
   die dieses Interface "einbindet".
*/


public class MainInterface2{
	public static void main(String[] args){
		Kuh k1 = new Kuh("Berta",500, 50);
		Kuh k2 = new Kuh("Elsa",600, 60);
		
		Henne h1 = new Henne("Elfriede", 2, 4);
		Henne h2 = new Henne("Jennifer", 3, 6);
		
		k1.printAllAttributes1();
		k2.printAllAttributes1();
		h1.printAllAttributes1();
		h2.printAllAttributes1();

		// zum Testen
		//MyPrintInterface1 mypr1 = new Kuh("Diti", 6, 9);
		//MyPrintInterface1 mypr2 = new Henne("Janini", 700, 90);
		MyPrintInterface1 mypr1 = k1;
		MyPrintInterface1 mypr2 = h1;
		MyPrintInterface1 mypr3;
		mypr3= h1;
		// falsch: "Untertyp = Obertyp"
		//h2=mypr3;
		
	}
}

abstract class Nutztier{
// Name des Tiers
	private String name;
	// Alter des Tieres
	private int alter;
	
	public Nutztier(String pname, int palter){
		name = pname;
		alter = palter;
	}
	
	public void setName(String n){
		name = n;
	}
	
	public String getName(){
		return(name);
	}
	
	public void setAlter(int palter){
		alter = palter;
	}
	
	public int getAlter(){
		return(alter);
	}
	
	public void printAllAttributes1(){
		System.out.println("Eigenschaften des Tiers:");
		System.out.println("Nutztier-Name= "+name);
		System.out.println("Nutztier-Alter= "+alter);
	}
}


class Kuh extends Nutztier implements MyPrintInterface1{
	// Milchleistung (pro Zeiteinheit). 
	private double milchleistung;
	
	public Kuh(String pname, int palter, double pmilchleistung){
		// super(...) muß die erste Anweisung im Konstruktor sein !!!
		super(pname, palter);
		milchleistung = pmilchleistung;
	}
	
	public void setMilchleistung(double pmilchleistung){
		milchleistung = pmilchleistung;
	}
	
	public double getMilchleistung(){
		return(milchleistung);
	}
	
	public void printAllAttributes1(){
		// Mit dem Bezeichner "super" greift man direkt auf die 
		// entsprechende Methode der Oberklasse zu.
		// System.out.println("Kuh-Name= "+super.getName());
		super.printAllAttributes1();
		System.out.println("Kuh-Milchleistung= "+milchleistung);
		System.out.println();
	}
}

// Folgender Kopf wäre zwar auch möglich, doch hätte man dann 
// kein Interface imlementiert class Henne extends Nutztier{
class Henne extends Nutztier implements MyPrintInterface1{
	// Legeleistung der Henne (Anzahl der Eier pro Zeiteinheit)
	private double legeleistung;
	
	public Henne(String pname, int palter, double plegeleistung){
		// super(...) muß die erste Anweisung im Konstruktor sein !!!
		super(pname, palter);
		legeleistung = plegeleistung;
	}
	
	public void setLegeleistung(double plegeleistung){
		legeleistung = plegeleistung;
	}
	
	public double getLegeleistung(){
		return(legeleistung);
	}
	
	public void printAllAttributes1(){
		super.printAllAttributes1();
		System.out.println("Henne-Legeleistung= "+legeleistung);
		System.out.println();
	}
}


