【问题标题】:New instance in switch交换机中的新实例
【发布时间】:2018-01-17 21:43:14
【问题描述】:

我目前正在学习 java 和 oop。 当我必须根据条件实例化一个新对象时,我遇到了问题。每个对象都具有相同的类型。 根据条件,我想传递我的对象 playerAnimal 和 animalSauvage 以便让它们战斗。 (有点像玩家遇到野蛮的口袋妖怪)。

switch (animalChosen) {
    case "Chien":
        Animaux playerChien = new Chien(animalName);
        playerChien.displayStat();
        break;
    case "Chat":
        Animaux playerChat = new Chat(animalName);
        playerChat.displayStat();
        break;
    case "Furet":
        Animaux playerFuret = new Furet(animalName);
        playerFuret.displayStat();
        break;
    default
        break;
}

switch (randAnimalSauvage()) {
    case "Chien":
        Animaux chienSauvage = new Chien();
        chienSauvage.displayStat();
        break;
    case "Chat":
        Animaux chatSauvage = new Chat();
        chatSauvage.displayStat();
        break;
    case "Furet":
        Animaux furetSauvage = new Furet();
        furetSauvage.displayStat();
        break;
    default:
        break;
}
Fight letsFight = new Fight(Animaux playerAnimal, Animaux animalSauvage);
letsFight.battle(Animaux playerAnimal, Animaux animalSauvage);

PS:我是法国人,不要介意变量名的含义;)

提前致谢

【问题讨论】:

  • 你遇到了什么问题?
  • 你可以使用相同的变量名,player & chat 也许,初始化它,然后用它来创建 Flight 对象。
  • 调用方法或构造函数时,不要传递参数的类型,只传递值,即new Fight(playerAnimal, animalSauvage)letsFight.battle(playerAnimal, animalSauvage);

标签: java design-patterns instantiation


【解决方案1】:

你可以这样做

Animal animal= null;
switch (animalChosen) {
    case "Chien":
        animal = new Chien(animalName);
        break;
    case "Chat":
        animal = new Chat(animalName);
        break;
    case "Furet":
        animal = new Furet(animalName);
        break;
      default
        break;
 }
 animal.displayStat();

这是有效的,因为(我假设,这就是必要的情况)ChienChatFuret 都是 Animal 的子类(或实现接口,无论它是什么)。

对敌方Animal也是如此。由于这两种情况相同,您只需创建一个函数即可。

private Animal byName(String animalName) {
    // same code as above, returning the animal
    return animal;
}

然后会这样调用:

Animal playerAnimal = byName(playerChoice);
Animal savageAnimal = byName(randAnimalSauvage());
Fight letsFight = new Fight(playerAnimal, savageAnimal);
letsFight.battle(playerAnimal, savageAnimal);

【讨论】:

    【解决方案2】:
        Animaux chosenPlayerAnimal;
    
        switch (animalChosen) {
            case "Chien":
                chosenPlayerAnimal = new Chien(animalName);
                break;
            case "Chat":
                chosenPlayerAnimal = new Chat(animalName);
                break;
            case "Furet":
                chosenPlayerAnimal = new Furet(animalName);
                break;
            default:
                chosenPlayerAnimal = new SomeDefaultAnimal(animalName);
                break;
        }
    
        Animaux animalSauvage;
    
        switch (randAnimalSauvage()) {
            case "Chien":
                animalSauvage = new Chien();
                break;
            case "Chat":
                animalSauvage = new Chat();
                break;
            case "Furet":
                animalSauvage = new Furet();
                break;
            default:
                animalSauvage = SomeDefaultAnimal();
                break;
        }
    
        chosenPlayerAnimal.displayStat();
        animalSauvage.displayStat();
    
        Fight letsFight = new Fight(chosenPlayerAnimal, animalSauvage);
        letsFight.battle(chosenPlayerAnimal, animalSauvage);
    

    我真的不明白你为什么用你已经在构造函数中提供的动物来调用Fight.battle()

    【讨论】:

    • 非常感谢!我的方法有点大,所以我想专门为战斗创建一个类。 :)
    猜你喜欢
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多