Конструктор имеет другой тип параметра с полем данных - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть класс под названием Monster, у каждого Monster есть имя, дата рождения и оружие.и конструктор Monster должен иметь следующую подпись:

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

Для создания монстра должен работать следующий код:

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

Поэтому я создаю поле данных в Monster:

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

Однако я должен использовать класс MyDate, определенный ниже, чтобы создать объект MyDate для dateofbirth.И используйте класс оружия, определенный ниже, чтобы создать объект оружия для оружия монстра.

Если бы мне пришлось использовать Object MyDate и Weapon, их тип отличался бы от конструктора (int day, int month, int year) и (String armsName), я пытаюсь привести параметры, но это компилирует ошибку.Кроме кастинга, есть ли другой способ добиться этого?Спасибо.

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;
    }
}

Ответы [ 4 ]

0 голосов
/ 21 ноября 2018

Мне не совсем понятно, о чем вы спрашиваете.Если вы указываете, что вы должны сохранить конструктор Monster, как вы его определили, но хранить объекты MyDate и Weapon в вашем классе Monster, тогда ответ прост:

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);
}

Я не думаю, что это таксцепления это очень хорошая идея.Лучше определить ваш конструктор следующим образом:

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

и вызвать конструктор следующим образом:

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

Кроме того, вы можете взглянуть на использование java.time.LocalDate длязамените свой класс MyDate.

Если у вас есть фиксированный набор оружия.Вы можете переопределить оружие как перечисление, а не как класс

public enum Weapon {
   VenomThrower, . . . ;
}

Тогда ссылки на оружие будут выглядеть так:

Weapon.VenomThrower
0 голосов
/ 21 ноября 2018

Я бы сказал так:

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()
    }
    //...
}

Вы должны обязательно отбросить лишние день, месяц и год, потому что они хранятся в dayOfMonth.

0 голосов
/ 21 ноября 2018

Вы можете создать другой конструктор, чтобы принимать объекты MyDate и Weapon:

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

, или в своем конструкторе вы можете сделать:

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

Чтобы создать соответствующийобъекты с заданными параметрами

0 голосов
/ 21 ноября 2018

Как вы видели, вы не можете просто пойти и привести произвольные переменные к другим классам.Однако вы можете вызвать соответствующие конструкторы MyDate и Weapon в конструкторе 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...