2017-05-08 6 views
0

Ich erstellte ein Testprojekt, aber ich stieß auf etwas, das ich nicht herausfinden kann.Java Calling Constructor

Ich versuche Monster in FightManager aufzurufen. Ich mag Monster Variablen (name, health, damage und defense), um gleich, was auch immer Monster randomisiert wird (WolfMonster oder GoblinMonster)

Vorher hatte ich nur ein Monster, und ich schaffte es zu tun, aber jetzt, wo gibt es 2 Monster Wie kann ich den Variablen einen anderen Wert geben, wenn ein anderes Monster ausgewählt wird?

public class Units { 
    int health; 
    int damage; 
    int defense; 
    String name; 

    public boolean isAlive(){ 
     if(health >= 1){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 
} 

public class Monster extends Units{ 
    public Monster(String name,int health,int damage,int defense){ 
     this.name = name; 
     this.health = health; 
     this.damage = damage; 
     this.defense = defense; 
    } 
} 

public class GoblinMonster extends Monster { 
    public GoblinMonster(String name, int health, int damage, int defense) { 
     super("Goblin",50,5,6); 
     this.name = name; 
     this.health = health; 
     this.damage = damage; 
     this.defense = defense; 
    } 
} 

public class WolfMonster extends Monster { 
    public WolfMonster(String name, int health, int damage, int defense) { 
     super("Wolf",50,5,6); 
     this.name = name; 
     this.health = health; 
     this.damage = damage; 
     this.defense = defense; 
    } 
} 

public class FightManager { 

    GameManager manage = new GameManager(); 
    Player player = new Player("Player",100,10,5); 
    GoblinMonster gobli = new GoblinMonster("Goblin", 40, 7, 4); 
    WolfMonster wolf = new WolfMonster("Wolf",50,9,6); 

    boolean myTurn = true; 
    .... 

Ich möchte wissen, wie man einen Wert von Monster zuweisen je nachdem, welche Monster erzeugt wird.

+2

Es ist nicht klar, was Sie verlangen. Könnten Sie bitte angeben, was Sie mit Wert meinen? –

+4

Ich sehe hier keine Notwendigkeit für zwei Unterklassen. Sie haben genau die gleichen Felder und das gleiche Verhalten (keine überschriebene Methode). Außerdem machen Ihre Konstruktoren keinen Sinn. Sie initialisieren jedes Feld zweimal: einmal im Basiskonstruktor und einmal im Unterklassenkonstruktor. Und Sie übergeben einen fest codierten Namen aus dem Konstruktor der Unterklasse, überschreiben ihn jedoch unmittelbar danach mit dem übergebenen Namen. –

+0

Nicht sicher, was das Problem ist. Es scheint, dass Sie verwirrt sind über [polymorphes Verhalten] (https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html). –

Antwort

0

Vielleicht, was Sie tun möchten, ist "Name" als Konstante in jedem Konstruktor setzen.

So zum Beispiel WolfMonster wäre:

public class WolfMonster extends Monster { 
    public static String TYPE = "Wolf"; 
    public WolfMonster(int health, int damage, int defense) { 
     super(WolfMonster.TYPE,health,damage,defense); 
    } 
} 

Beachten Sie, dass Sie nicht brauchen, um die Mitgliederfelder reasign als die zugewiesen wird WHE super() aufgerufen wird.

1

Ich sehe keine Notwendigkeit für mehrere Unterklassen und Elternklasse hier. Sie können einfach verschiedene Monsterobjekte mit den Namen WolfMonster, GoblinMonster erstellen.

public class Monster { 
    int health; 
    int damage; 
    int defense; 
    String name; 

    Monster(String name, int health, int damage, int defense) 
    { 
     this.name = name; 
     this.health = health; 
     this.damage = damage; 
     this.defense = defense; 
    } 
    public boolean isAlive() 
    { 
     if(health >= 1){ 
      return true; 
     }else{ 
      return false; 
     } 
    }  
} 

public class FightManager { 

    GameManager manage = new GameManager(); 
    Player player = new Player("Player",100,10,5); 

    //changes 

    Monster gobli = new Monster("Goblin", 40, 7, 4); 
    Monster wolf = new Monster("Wolf",50,9,6); 

    boolean myTurn = true; 

    // To-Do 
} 
+0

Ja, ich dachte darüber nach, aber in der Zukunft plane ich mehr und mehr Monster hinzuzufügen und ich denke, es wird mit dieser Methode übertrieben sein – Stonny

+0

Du kannst immer mehr Monster benutzen, indem du neues Monster nennst ("SomeName", 40, 7, 4); –

0

zu tun, so müssen Sie Polymorphismus verwenden, das von der Einheit Klasse als Schnittstelle .Das Verfahren IsAlive erklärt() als abstraktes sowie das attribute .In der anderen Seite sollen die Klasse Monster die Einheit-Schnittstelle implementieren und der Rest deiner Monsterklassen wird die Klasse Monster erweitern. Schließlich werden Sie die Methode isAlive() bei jeder Unterklasse übersteuern, dann Voila!

+0

Du hast mich gerettet, Bruder! Danke wirklich eine Antwort, die ich suchte – Stonny