# 2 methoden mit gleichen namen und ein Interface



## sengul (13. Jan 2017)

Hallo,
meine Problem ist. Ich habe ein *Interface Generator* mit der *Methode Zufallszahl*. Diese *methode Zufallszahl* wird in zwei Klassen mit selben namen auf zwei unterschiedliche weise implementiert. Nun möchte ich in der *Klasse A* diese methode Zufallszahl einmal rufen, aber welcher implementation zum einsatz kommt, soll wahrend der laufzeit festgelegt werden. Wie kann ich das machen? Ich selber komme nicht drauf, kann mir das jemand mit einem beispiel erklaren.
Vielen Dank


----------



## Viktim (13. Jan 2017)

Ein Interface musst du ja immer in einer Klasse Implementieren.
Und wenn du von der Klasse ein Objekt erzeugst, hat dein Objekt ja einen Namen.
Also als Beispiel:

```
public class TEST {
  public static void main(String[] args) {
    Generator k1 = new Klasse1();
    Generator k2 = new Klasse2();

    //Hier wird das dann festgelegt:
    System.out.println(k1.getZufallsZahl()); 
    System.out.println(k2.getZufallsZahl());
  }
}
```


```
public interface Generator {
  public int getZufallsZahl();
}
```


```
public class Klasse1 implements Generator {

  @Override
  public int getZufallsZahl() {
    return 0;
  }

}
```


```
public class Klasse2 implements Generator {

  @Override
  public int getZufallsZahl() {
    return 1234;
  }

}
```

So mein ich das.

Die Methoden getZufallszahl musst du halt anders füllen, aber so wie das hier ist, kannst du sofort sehen, welche Methode ausgeführt wird.

Ich bin mir nicht sicher, ob ich deine Frage richtig verstanden hab.


----------



## sengul (13. Jan 2017)

Also wie du das gemacht hast, ist es doch so das ich es angebe welche Implementation der methode getZufallsZahl() zum Einsatz kommt oder ?   Aber in der Aufgabe steht:   Welche konkrete Implementierung zum Einsatz kommt, soll dabei zur Laufzeit festgelegt werden.


----------



## Viktim (13. Jan 2017)

Hmmm was ist denn die Anforderung, wie soll man das denn zur Laufzeit bestimmen? Soll man einen Button drücken oder aus einer Checkbox auswählen, oder einfach irgendeine zufällige Implementation nehmen?


----------



## sengul (13. Jan 2017)

Gute frage, ich verstehe auch ganz was in der aufgabe erwünscht ist! Vielleicht verstehe ich es falsch? unten ist die Aufgabe

Erweitern Sie Ihre Klasse Zufallszahl aus Aufgabe 2 um die Unterstützung für verschiedene Zufallszahl-Generatoren. Erstellen Sie dazu eine Schnittstelle ZufallszahlGenerator, die eine Methode zur Berechnung einer Zufallszahl definiert. Erstellen Sie anschließend mindestens zwei verschiedene Klassen, die diese Schnittstelle implementieren und auf jeweils unterschiedliche Weise eine Zufallszahl erzeugen. Eine mögliche Implementierung können Sie aus Aufgabe 2 übernehmen, die Zufälligkeit der erzeugten Zahlen steht aber bei dieser Aufgabe nicht im Vordergrund (beispielsweise könnte Ihre Implementierung auch stets die gleiche „Zufallszahl“ 42 zurückliefern). Ändern Sie nun die Klasse Zufallszahl so ab, das sie die Berechnung der Zufallszahl an eine beliebige, die Schnittstelle ZufallszahlGenerator implementierende Klasse delegiert. Welche konkrete Implementierung zum Einsatz kommt, soll dabei zur Laufzeit festgelegt und geändert werden können.


----------



## Joose (13. Jan 2017)

So könnte es gemeint sein 

```
public class KlasseA {

   private Generator generator;
   
   public void setGenertor(Generator generator) {
       this.generator = generator;
   }
   
   public void doSomething() {
       generator.zufallszahl();
   }
   
   public static void main(String[] args){
       KlasseA a = new KlasseA();
       
       do
       {
           Generator gen = null;
           String implToUse = lies von der Konsole
           if(implToUse.equals("impl1")) {
               gen = new DeineKlasseMitImplementierung1();
           } else if(implToUse.equals("impl2") {
               gen = new DeineKlasseMitImplementierung2();
           } else {
               gen = new StandardImplementierung();
           }
           
           a.setGenerator(gen);
           a.doSomething();
       }while(...);
   }
}
```

Du hast deine X Klassen, welche das Interface implementieren.
Eine Klasse hat ein Attribut vom Typ des Interfaces. Dieses Attribut kann mit dem Objekt einer Klasse belegt werden, welches das Interface implementiert.
Von welcher deiner X Klasse du nun ein Objekt erstellst könnte zum Beispiel per switch entschieden werden oder ähnlichem.


----------



## Viktim (13. Jan 2017)

ahh okay 


sengul hat gesagt.:


> Welche konkrete Implementierung zum Einsatz kommt, soll dabei zur Laufzeit festgelegt und geändert werden können.


hier steht ja schon, dass du das irgendwie ändern können sollst, hast du eine GUI oder ist das eine Konsolen-Anwendung?


----------



## sengul (13. Jan 2017)

Es ist eine Konsolenanwendung


----------



## sengul (13. Jan 2017)

Danke Joose, jetzt habe ich es verstanden, ich glaube ich weiss nicht genau was eine laufzeit ist!


----------



## Joose (13. Jan 2017)

Zur Laufzeit -> während dein Program läuft


----------

