/* B E S C H R E I B U N G
Klassen:
  Kuh, Henne, BildschirmAusgabe

Interface:
   PrintAttribut
   Jede Klasse sollte - zumindest zu Testzwecken - jeweils die Methode
   printAttribut(int i) enthalten, mit der das i-te Attribute einer Klasse auf dem
   Bildschirm ausgegeben wird.
   In der Klasse BildschirmAusgabe gibt es die Methode 
   printSpecialAttributs(int g1, int g2, Object k)
   mit der man alle Attribute vom vom g1-ten bis g2-ten Attribut des Objekts k
   auf dem Bildschirm ausgegeben wird.  
   Dies ist die eine Seite des "Vertags". Die andere Seite des Vertrags verlangt,
   dass dazu die Methode printAttribut(int i) vom Programmierer implementiert 
   werden muss. 
   Das wird dadurch erreicht, dass man in den Klassen, in denen man Attribute 
   ausgeben will, das Interface PrintAttribut implementieren muss.   
   
   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".
*/

package de;

public class MainInterface5{
    public static void main(String[] args){
        Kuh k1 = new Kuh("Berta", 50);
        Kuh k2 = new Kuh("Elsa", 60);

        Henne h1 = new Henne("Elfriede", 4);
        Henne h2 = new Henne("Jennifer", 6);
        BildschirmAusgabe a = new BildschirmAusgabe();

        a.printSpecialAttributs(1, 1, k1);
        a.printSpecialAttributs(0, 1, h1);        
        	
    }
}

class BildschirmAusgabe{
	public void printSpecialAttributs(int g1, int g2, Object k){
		int i;
		for(i=g1;i<=g2;i++){
			((MyPrintInterface5)k).printAttribut(i);	
		}
	}
}
		

class Kuh implements MyPrintInterface5{
	// Name des Tiers
	private String name;
	
    // Milchleistung (pro Zeiteinheit). 
    private double milchleistung;

    public Kuh(String pname, double pmilchleistung){
    	name=pname;	
    	milchleistung = pmilchleistung;
    }

    public void setName(String pname){
	    name = pname;
	}

	public String getName(){
	    return(name);
	}
    
    
    public void setMilchleistung(double pmilchleistung){
        milchleistung = pmilchleistung;
    }

    public double getMilchleistung(){
        return(milchleistung);
    }

    public void printAttribut(int i){
    	if(i==0)
    		System.out.println("Kuh-Name= "+name);
    	else if(i==1)
    		System.out.println("Kuh-Milchleistung="+milchleistung);
    	else
    		System.out.println("außerhalb der Index-Grenzen");    		
	}
}
   	

class Henne implements MyPrintInterface5{
	  // Name des Tiers
	  private String name;
	
	// Legeleistung der Henne (Anzahl der Eier pro Zeiteinheit)
	private double legeleistung;

	public Henne(String pname, double plegeleistung){
    	name=pname;		
		legeleistung = plegeleistung;
	}

	  public void setName(String pname){
	    name = pname;
	}

	public String getName(){
	    return(name);
	}
	
	
	public void setLegeleistung(double plegeleistung){
		legeleistung = plegeleistung;
	}

	public double getLegeleistung(){
		return(legeleistung);
	}
	
    public void printAttribut(int i){
    	if(i==0)
    		System.out.println("Henne-Name= "+name);
    	else if(i==1)
    		System.out.println("Henne-Legeleistung= "+legeleistung);
    	else
    		System.out.println("außerhalb der Index-Grenzen");    		
	}
	
}


