Frage zu Interfaces



  • Haben jetzt zum ersten Mal Interfaces, und ich habe eine vereinfachte version der eigentlichen Aufgabe programmiert, die so aber läuft...

    hier die wichtige Klassen:

    import java.util.Random;
    public class Generator1 extends Random implements IRandomInt {
    
    }
    
    public class Generator2 implements IRandomInt {
    
    	public int nextInt(int n) {
    		return(0);
    	}
    
    }
    
    public interface IRandomInt {
    
    	public int nextInt(int n);
    
    }
    
    public class ChiQuadratTest  {
    
    	static double test(IRandomInt generator, int oberGrenze, int
    	anzahl)  {
    
    		int[] field=new int[anzahl];  
    		for (int i = 0; i < anzahl; i++) 
    		   {
    			 field[i]=generator.nextInt(oberGrenze);
       		   }
    
    		for (int i = 0; i < anzahl; i++) 
    		   {
    				System.out.println(field[i]);
    		   }   
    
    		return 0;
    
    	}
    }
    
    public class controller {
    
    	public static void main(String[] args) {
    
    		Generator1 g1 = new Generator1();
    		Generator2 g2 = new Generator2();
    
    		ChiQuadratTest.test(g1,10,10);
    		ChiQuadratTest.test(g1,500,5);
    		ChiQuadratTest.test(g2,500,5);
    	}
    }
    

    Da werden jetzt einfach felder gefüllt und ausgegeben.

    1. Wofür braucht man hier Interface ? Das wird ja nur verwendet, das man verschiedene Test mit den verschiedenen (da kommen noch mehr) zufallsgeneratoren laufen lassen kann.

    Gibt es dabei keine andere Lösung als Interfaces ? Sehe den Sinn und auch die funktionsweise nicht so ganz, denn in

    class ChiQuadratTest wird ja

    static double test(IRandomInt generator, int oberGrenze, int
    anzahl)

    aufgerufen, wobei generator doch ein Typ von IRandomInt ist, wieso kann ich dann da aber g1 übergeben,was wiederum ein Typ von generator1 ist ? Das geht doch eigentlich gar nicht.

    Wäre froh wenn mir dabei jemand helfen könnte,sowie den Sinn von Interfaces (explizit hier) zu erklären...



  • Hi. Interfaces geben dir die Möglichkeit Code zu schreiben, der nur auf die Schnittstelle angewiesen ist, die durch ein Interface definiert wird. Was für eine Klasse, das dahinterstehende Objekt hat, ist völlig egal.

    in deinem Beispiel müßte man ansosnten die Funktion test() 2 mal überladen, was natürlich ungeschickt wäre:

    static double testForGen1(Generator1 generator, int oberGrenze, int 
        anzahl)  { 
    
            int[] field=new int[anzahl];   
            for (int i = 0; i < anzahl; i++)  
               { 
                 field[i]=generator.nextInt(oberGrenze); 
                  } 
    
            for (int i = 0; i < anzahl; i++)  
               { 
                    System.out.println(field[i]); 
               }    
    
            return 0; 
    
        } 
    
    static double testForGen2(Generator2 generator, int oberGrenze, int 
        anzahl)  { 
    
            int[] field=new int[anzahl];   
            for (int i = 0; i < anzahl; i++)  
               { 
                 field[i]=generator.nextInt(oberGrenze); 
                  } 
    
            for (int i = 0; i < anzahl; i++)  
               { 
                    System.out.println(field[i]); 
               }    
    
            return 0; 
    
        }
    

    der Funktionscode wäre völlig gleich. Nur weil es 2 verschiedene Klassen sind müßte man dann das ganze 2 mal schreiben. Durch das Interface kann man in seinem Programm ausdrücken, daß diese beiden Klassen ein Konzept (nämlich die
    Methode nextInt() ) gemeinsam haben und in dieser Sache austauschbar sind..

    Hoffe, das war ein wenig verständlich, wenn du immer noch nicht durchblickst lies dir einfach mal ein Java-Buch/Tutorial über das Thema durch

    cu


Anmelden zum Antworten