J'ai une classe appelée Monster, chaque monstre a un nom, une date de naissance et une arme. et Le constructeur Monster doit avoir la signature suivante:

Monster(String name, int day, int month, int year, String weaponName)

Pour créer un monstre, le code suivant devrait fonctionner:

new Monster("Godzilla",11,10,2000,"VenomThrower")

Je crée donc le champ de données dans Monster:

public String name;
public MyDate dateOfBirth;
public int day;
public int month;
public int year;
public Weapon weapon;

Cependant, je dois utiliser la classe MyDate définie ci-dessous pour créer un objet MyDate pour dateofbirth. Et utilisez la classe Weapon définie ci-dessous pour créer un objet Weapon pour l'arme du monstre.

Si je dois utiliser Object MyDate et Weapon, leur type serait différent du constructeur (int day, int month, int year) et (String weaponName), j'essaye de convertir les paramètres, mais cela compile l'erreur. À part le casting, y a-t-il un autre moyen d'y parvenir ?? Merci.

public class MyDate {

    private int year;
    private int month;
    private int day;


    MyDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }
}

public class Weapon {

    private String name;
    Weapon(String n) {
        this.name = n;
    }
    public String getName()   {
        return name;
    }
}
2
Shin Yu Wu 21 nov. 2018 à 01:51

4 réponses

Meilleure réponse

Comme vous l'avez vu, vous ne pouvez pas simplement convertir des variables arbitraires dans d'autres classes. Vous pouvez cependant appeler les constructeurs respectifs de MyDate et Weapon dans le constructeur de Monster:

public class Monster {
    private String name;
    private MyDate dateOfBirth;
    private Weapon weapon;

    public Monster(String name, int day, int month, int year, String weaponName) {
       this.name = name;
       this.dateOfBirth = new MyDate(year, month, day);
       this.weapon = new Weapon(weaponName);
    }
}
2
Mureinik 20 nov. 2018 à 22:56

J'irais comme ça:

public class Monster{

    public String name;
    public MyDate dateOfBirth;
    public Weapon weapon;

    public Monster(String name, int day, int month, int year, String weaponName){
        this.name = name;
        this.dateOfBirth = new DateOfBirth(day, month, year);
        this.weapon = new Weapon(weaponName);
    }

    //second constructor for good measure
    public Monster(String name, DateOfBirth day, Weapon weapon){
        this.name = name;
        this.dateOfBirth = day;
        this.weapon = weapon;
    }

    //also relay all getters and setters to the underlying objects:
    public int getDay(){
        return dateOfBirth.getDay()
    }
    //...
}

Vous devez absolument supprimer le jour, le mois et l'année redondants, car ils sont stockés dans dayOfMonth.

2
leonardkraemer 20 nov. 2018 à 23:03

Je ne sais pas exactement ce que vous demandez. Si vous indiquez que vous devez conserver le constructeur Monster tel que vous l'avez défini, mais que vous stockez les objets MyDate et Weapon dans votre classe Monster, alors la réponse est simple.

Monster(String name, int day, int month, int year, String weaponName) {
    this.name = name;
    this.dateOfBirth = new MyDate(year, month, day);
    this.weapon = new Weapon(weaponName);
}

Je ne pense pas que ce type de couplage soit une très bonne idée. Mieux vaut définir votre constructeur comme ceci:

Monster(String name, MyDate dateOfBirth, Weapon weapon) {
    this.name = name;
    this.dateOfBirth = dateOfBirth;
    this.weapon = weapon;
}

Et appelez le constructeur comme ceci:

Monster m = new Monster("Godzilla", new MyDate(2000,11,10), new Weapon("VenomThrower"));

De plus, vous voudrez peut-être jeter un œil à l'utilisation de java.time.LocalDate pour remplacer votre classe MyDate.

Si vous avez un ensemble fixe d'armes. Vous pouvez redéfinir Weapon comme une énumération plutôt qu'une classe

public enum Weapon {
   VenomThrower, . . . ;
}

Les références d'armes ressembleront alors à:

Weapon.VenomThrower
0
Tom Drake 21 nov. 2018 à 00:09

Vous pouvez soit créer un autre constructeur pour accepter les objets MyDate et Weapon:

public Monster(String name, MyDate birthDay, Weapon weapon) {
   //...
}

Ou dans votre constructeur, vous pouvez faire:

public Monster(String name, int day, int month, int year, String weaponName){ 
    this.weapon = new Weapon(weaponName);
    this.dateOfBirth = new MyDate(day, month, year);
    //...
}

Pour créer les objets appropriés à partir des paramètres donnés

1
GBlodgett 20 nov. 2018 à 22:57