Выбор объекта и печать изнутри класса - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь, чтобы пользователь выбрал животное из моего файла virtualZoo.java при его запуске.Он компилируется, но как только пользователь вводит выборку, я получаю сообщение об ошибке «Ошибочный тип дерева».Код ниже для virtualZoo.java, animal.java и dog.java.Я создал объекты под оператором switch, поскольку мне было поручено их использовать, но я не понимаю их реализацию.

virtualZoo.java

import java.util.Scanner;

public class VirtualZoo{
public static void main(String[] args) {

                    Animal cat = new Animal("Cat", "Meow");
                    Animal dog = new Animal("Dog", "Woof");
                    Animal duck = new Animal("Duck", "Quak");

    // create Scanner
    Scanner input;
    input = new Scanner(System.in);
        double userInput;
                    System.out.println("Welcome to the Zoo");
                    System.out.println("Pick select an animal to visit");
        System.out.println("=================================");
        System.out.println("===========MAIN MENU=============");
        System.out.println("=================================");
        System.out.println("==  0) Cat    ===================");
        System.out.println("==  1) Dog    ===================");
        System.out.println("==  2) Duck   ===================");
        System.out.println("== -1) EXIT   ===================");
        System.out.println("=================================");
        System.out.println();System.out.println();
        System.out.println( "Input  : ");
        Scanner sc = new Scanner(System.in);
        userInput = sc.nextInt();


    switch (sc.nextInt()) {
        case 0:
            System.out.println(cat);
            break;
        case 1:
            System.out.println(dog);
            break;
        case 2:
            System.out.println(duck);
            break;
        case -1:
            System.out.println("Your name is short length.");
            break;
        default:
            break;
    }
                    duck.speak();
                    dog.speak();
                    cat.speak();


  }

}

animal.java (класс животных в virtualZoo.java)

public class Animal {
private String animalSound;
private String animalType = "";

//set animal sound
public void setSound(String sound) { this.animalSound = sound; }

//get animal sound
public String getSound() { return animalSound; }
public void setType(String type) { this.animalType = type; }

//get animal type
public String getType() { return animalType; }


public Animal(String animalType, String animalSound)
{
    this.animalSound = "";
    this.animalType = animalType;
    this.animalSound = animalSound;
}

public void speak()
 {
    System.out.println("The " + animalType + " says " + animalSound);
 }
}

dog.java (класс собаки в классе животных)

public class Dog extends Animal {

public Dog(String animalType, String animalSound) {
    super(animalType, animalSound);
}

@Override
public void speak(){

    System.out.println("This dog barks");

  }
}

1 Ответ

0 голосов
/ 23 сентября 2018

Вы на правильном пути, но я верю, что у вас есть ошибки.Я предполагаю, что код, который вы разместили, немного отличается от кода, который выдает ошибку (я проверял и не получил ошибку)

Здесь вы получаете 2 ввода от пользователя,Я полагаю, что вы хотели получить только 1.

userInput = sc.nextInt(); switch (sc.nextInt())

Кроме того, userInput должно иметь тип int, а не double.

У вас есть класс собаки, но нет класса кошка / утка

Похоже, вы пытаетесь использовать фабричный шаблон, но я неНа 100% уверен.Вы можете создать класс AnimalFactory, если это так.В противном случае класс «Животное» сбивает с толку.Я предполагаю, что вы не используете Factory Pattern.

Вы заметите несколько вещей:

Я переопределяю метод toString() из Object.System.out.println вызовет метод toString().

Кошка, утка и собака все простираются от Animal, поэтому ваш Animal animalSelected может относиться к любому из этих типов!

Животное имеет2 абстрактных метода.Эти методы должны быть переопределены в любых подклассах (Cat, Dog, Duck).Имея объявленные методы Means, мы можем использовать методы внутри класса Animal.Это также позволяет нам вызывать методы для любых животных.

Например, вы можете использовать animalSelected.getAnimalSound(), хотя Animal не определяет тело этого метода.

import java.util.Scanner;

public class VirtualZoo
{
    public static void main(String[] args) 
    {
    // Options
    final int catType = 0,
              dogType = 1,
              duckType = 2,
              exit = -1;

    // create Scanner
    Scanner input;
    input = new Scanner(System.in);
        int userInput;
                    System.out.println("Welcome to the Zoo");
                    System.out.println("Pick select an animal to visit");
        System.out.println("=================================");
        System.out.println("===========MAIN MENU=============");
        System.out.println("=================================");
        System.out.println("==  " + catType + ") Cat    ===================");
        System.out.println("==  " + dogType + ") Dog    ===================");
        System.out.println("==  " + duckType + ") Duck   ===================");
        System.out.println("== " + exit + ") EXIT   ===================");
        System.out.println("=================================");
        System.out.println();
        System.out.println();
        System.out.println( "Input  : ");
        Scanner sc = new Scanner(System.in);
        userInput = sc.nextInt();

    Animal animalSelected = null;

    switch (userInput) 
    {
        case catType:
            animalSelected = new Cat();
            break;
        case dogType:
            animalSelected = new Dog();
            break;
        case 2:
            animalSelected = new Duck();
            break;
        case -1:
            System.out.println("Your name is short length.");
            break;
        default:
            break;
    }

    if (animalSelected != null)
    {
        System.out.println(animalSelected);
    }
}

}

public abstract class Animal 
{
    public abstract String getAnimalSound();
    public abstract String getAnimalType();

    @Override
    public String toString()
    {
       return "The " + getAnimalType() + " says " + getAnimalSound();
    }
}

public class Duck extends Animal 
{
    @Override
    public String getAnimalSound() 
    {
        return "quacks";
    }

    @Override
    public String getAnimalType() 
    {
        return "Duck";
    }

}

public class Cat extends Animal 
{
    @Override
    public String getAnimalSound() 
    {
        return "meows";
    }

    @Override
    public String getAnimalType() 
    {
        return "Cat";
    }
}


public class Dog extends Animal 
{
    @Override
    public String getAnimalSound() 
    {
        return "barks";
    }

    @Override
    public String getAnimalType() 
    {
        return "Dog";
    }
}
...