/* B E S C H R E I B U N G
Klassen:
  Kuh, Interface MyPrintInterface2

Schaubild (implementierte Hierarche)

      (Interface)  
   MyPrintInterface2     MyFeld
           ^                 
           |
           |        
           | 
          Kuh
          
  
Interface:
   MyPrintInterface2
   Anschaulich gesprochen wird ein Vertrag gemacht:
   Der Vertrag ist die Methode MyFeld.printAllElements(...), die verlangt,
   dass der Parameter eine Variable (Feld) mit einem beliebigen Typ 
   (Klasse) hat. Außerdem wird im Vertrag verlangt, dass diese Klasse
   (des Parameters) die Methode printAllAttributes() implementiert hat.
   Die Implementierung kann dadurch sichergestellt werden, dass die Klasse
   des Parameters eine Schnittstelle (MyPrintInterface2) implementiert, 
   die als Methodenkopf printAllAttributes() besitzt.  
   
   Bem:
   Die Klasse Myfeld hat nur den Sinn, dass dort die Methode 
   printAllElements() implementiert wird.
*/


public class MainInterface2{
	public static void main(String[] args){
		Kuh k1 = new Kuh("Berta",5, 50);
		Kuh k2 = new Kuh("Elsa",6, 60);
		Kuh[] kuehe = new Kuh[2];
		kuehe[0]=k1;
		kuehe[1]=k2;
		// Die Methode printAllElements(...) ist statisch        
		Myfeld.printAllElements(kuehe);
	}
}

class Kuh implements MyPrintInterface2{
	private String name;
	private int alter;
	private double milchleistung;
	
	public Kuh(String pname, int palter, double pmilchleistung){
		name = pname;
		alter = palter;
		milchleistung = pmilchleistung;
	}
	
	public void printAllAttributes(){
		System.out.println("Kuh-Milchleistung= "+name);
		System.out.println("Kuh-Milchleistung= "+alter);       
		System.out.println("Kuh-Milchleistung= "+milchleistung);
	}
}


class Myfeld {
	// Die Methode printAllElements(...) ist statisch
	static public void printAllElements(Object[]feld){
		for(int i=0;i<feld.length;i++)	
			((MyPrintInterface2)feld[i]).printAllAttributes();
	}
}
