/* B E S C H R E I B U N G
noch in der Testphase.
Testen ob es auch ohne Interface und abstrakte Klassen geht.
*/

package de;

public class MainInterface4{
  public static void main(String[] args){
      Kuh k1 = new Kuh("Berta",5, 50);
      Henne h1 = new Henne("Elsa",6, 60);
      Nutztier[] ntiere = new Nutztier[2];
      ntiere[0]=k1;
      ntiere[1]=h1;        
      Myfeld.printAllElements(ntiere);
  }
}


class Myfeld {
  static public void printAllElements(Object[]feld){
  	for(int i=0;i<feld.length;i++)	
  		((Nutztier)feld[i]).printAllAttributs();
  	}
}


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 pname){
	    name = pname;
	}

	public String getName(){
	    return(name);
	}

	public void setAlter(int palter){
	    alter = palter;
	}

	public int getAlter(){
	    return(alter);
	}

	public void printAllAttributs(){
	    System.out.println("Eigenschaften des Tiers:");
	    System.out.println("Nutztier-Name= "+name);
	    System.out.println("Nutztier-Alter= "+alter);
	}
}

class Kuh extends Nutztier{
	// 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 printAllAttributs(){
	// Da das Attribut "name" private ist, ergibt die folgende Anweisung eine
	// Fehlermeldung des Compilers.
	// System.out.println("Kuh-Name= "+name);
	
	// Folgende Anweisung greift auf die Methode getName() der Oberklasse zu,
	// da es getName() in der Klasse Kuh nicht gibt. Gäbe es getName()
	// in der Klasse Kuh, würde dieses getName() ausgeführt.
	// System.out.println("Kuh-Name= "+getName());
	
	// Mit dem Bezeichner "super" greift man direkt auf die entsprechende
	// Methode der Oberklasse zu.
	// System.out.println("Kuh-Name= "+super.getName());
	super.printAllAttributs();
	System.out.println("Kuh-Milchleistung= "+milchleistung);
	System.out.println();
	}
}


class Henne extends Nutztier{
	//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 m){
	     legeLeistung = m;
	}

	public double getLegeleistung(){
	     return(legeLeistung);
	}

	public void printAllAttributs(){
		super.printAllAttributs();
		System.out.println("Henne-Legeleistung= "+legeLeistung);
		System.out.println();
	}
}

