Interface Fragen zum Interface

Cygan93

Mitglied
Hallo,
ich mache gerade eine Aufgabe zu Rollenspiele:
Implementieren sie einen Programmausschnitt , bei dem ein Spieler seine Waffe wechseln kann.
Ich habe das UML mal mit hochgeladen.
Ich bin immoment soweit:
Klasse Spielfigur
Code:
package Rollenspiel;

public class Spielfigur {
    public static void main(String[] args){
   Spielfigur erste = new Spielfigur();
   Spielfigur zweite = new Spielfigur();
   
}

}
Interface Waffenverhalten
Code:
package Rollenspiel;

public interface Waffenverhalten{
   public void benutzeWaffe();
}
Klasse Axtschlagen
Code:
package Rollenspiel;

public class Axtschlagen implements Waffenverhalten {
   public void benutzeWaffe() {
     System.out.println("Benutze nun die Axt");
   }
}
Klasse Schwertschwingen
Code:
package Rollenspiel;

public class Schwertschwingen implements Waffenverhalten{

   @Override
   public void benutzeWaffe() {
     System.out.println("Benutze nun das Schwert");
     
   }

}
Meine Frage ist wie ich jetzt das Interface mit meiner Klasse verknüpfe. Sodass z.B "erster" die waffe von Axt zu Schwert wechseln kann.
Hat jemand tipps?
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    58,7 KB · Aufrufe: 27
Verknüpfen tust du die Klassen in dem deine Klasse Spielfigur ein Attribut vom Typ "Waffenverhalten" hat. Also :
Java:
public class Spielfigur {

    Waffenverhalten waffenverhalten;

    public static void main(String[] args) {
        Spielfigur erste = new Spielfigur();
        Spielfigur zweite = new Spielfigur();
    }

}

Dazu musst du dann einer setter-Methode schreiben die dem Attribut "waffenverhalten" eben entweder ein Objekt vom Typ "Schwertschwingen" oder ein Objekt vom Typ "Axtschlagen" zuweist.
 
Hallo,
ersteinmal danke für die Antwort!
Ich habe jetzt folgendes:
Code:
package Rollenspiel;

public class Spielfigur {
   public static void main(String[] args){
   Spielfigur erste = new Spielfigur();
   Spielfigur zweite = new Spielfigur();
   
/*   
   erste.setWaffe(Axtschlagen);
   zweite.setWaffe(Schwertschwingen);
   */

}
    public void setWaffe(Waffenverhalten waffe) {
   }
}
Allerdings weiß ich noch nicht recht wie ich jetzt explizit sagen kann das "erste" auf Axtschlagen zugreifen soll.
Hast du noch einen Tip?
 
Im einfachsten Fall rufst du setWaffe mit einer deiner beiden Implementierungen des Waffenverhaltens auf.
Java:
Spielfigur erste = new Spielfigur();
erste.setWaffe(new Axtschlagen());
erste.getWaffe().benutzeWaffe();
Außerdem musst du die Main-methode aus der Spielfigur ziehen. Da hat sie nichts zu suchen.
Was ich nicht schön finde ist, dass der setter suggeriert man setzt die Waffe, dabei ist der Parameter Waffenverhalten.

Entgegen dem Vorschlag von Tarrew denke ich: die Spielfigur sollte nichts vom Waffenverhalten wissen. Sie hat nur eine Waffe, die das Waffenverhalten kennt.
Es kommt darauf an wie du es Aufbauen möchtest. Im Prinzip bist du mit der kleinen Änderung fertig.
Ich würde es wie folgt machen: Das Waffenverhalten klingt für mich nach dem Strategie-Pattern.
Java:
class Main {

    public static void main(String... args) {

        final WaffenInventar waffenInventar = new WaffenInventar();
        final Spielfigur s1 = new Spielfigur();
        final Spielfigur s2 = new Spielfigur();
      
        s1.setWaffe( waffenInventar.getAxt() );
        s1.angreifen(s2);
        s1.setWaffe( waffenInventar.getSchwert() );
        s1.angreifen(s2);
    }
}
Java:
class WaffenInventar {

    Waffe getAxt() {
        final Waffe waffe = new Waffe();
        waffe.setWaffenverhalten(() -> System.out.println("Schwingt Axt"));
        return waffe;
    }

    Waffe getSchwert() {
        final Waffe waffe = new Waffe();
        waffe.setWaffenverhalten(() -> System.out.println("Schwingt Schwert"));
        return waffe;
    }
}
Java:
class Spielfigur {
    private Waffe waffe;

    void setWaffe(final Waffe waffe) {
        this.waffe = waffe;
    }

    public Waffe getWaffe() {
        return waffe;
    }

    void angreifen(final Spielfigur target) {
        // Hier kann man später den Schaden berechnen ..
        waffe.benutzen();
    }
}
Java:
class Waffe {

    private Waffenverhalten waffenverhalten;

    void benutzen() {
        // Delegation an konkrete Implementierung
        waffenverhalten.benutzeWaffe();
    }

    void setWaffenverhalten(final Waffenverhalten waffenverhalten) {
        this.waffenverhalten = waffenverhalten;
    }
}
 
Entgegen dem Vorschlag von Tarrew denke ich: die Spielfigur sollte nichts vom Waffenverhalten wissen. Sie hat nur eine Waffe, die das Waffenverhalten kennt.
Das war kein Vorschlag von mir, ich befolge lediglich die Aufgabenstellung. Und das UML Diagramm gibt die Struktur eben so vor.

Wie ich es persönlich machen würde, ist dann noch ne ganz andere Sache 😉
 
Das war kein Vorschlag von mir, ich befolge lediglich die Aufgabenstellung. Und das UML Diagramm gibt die Struktur eben so vor.

Wie ich es persönlich machen würde, ist dann noch ne ganz andere Sache 😉
Ich dachte das UML Diagramm ist selbsterarbeitet. Ich wollte dich nicht angreifen sondern meinen Ansatz von deinem abgrenzen.
 
War auch nicht so aufgefasst 😉

Könnte natürlich sein, allerdings hätte mich es gewundert wenn das Klassendiagramm so erstellt wurde, aber im Code kein Ansatz für diese Verknüpfung zwischen Spielfigur und Waffenverhalten zu erkennen ist. Aber ich will es nicht ausschließen. Der TE scheint es ja gelöst zu haben ,)
 

Zurück
Oben