我试图根据用户输入选择一个特定的子类,但我不太清楚如何做到这一点。例如:
System.out.println("Select animal:\n1. Cat\n2. Dog");
int input = keyboard.nextInt();
if(input == 1){
Cat newPet = new Cat();
}
else{
Dog newPet = new Dog();
}
这只是我刚才创建的一个简单示例,因此可以解释任何语法错误。我理解,一旦if语句结束,newPet
对象就超出了范围,因此之后就不能再使用它了。我也尝试了一些案例,但这不起作用,因为我宣布newPet
两次,即使每次运行程序只能访问一个。
根据用户输入,程序中的更多不同因素会受到影响。我总是可以在每个不同的因素中使用if语句,但是想知道是否有更简洁的方法来执行此操作?
答案 0 :(得分:2)
您可以创建一个界面,Animal。 猫与狗应该实施动物。 您的代码可以更改为
System.out.println("Select animal:\n1. Cat\n2. Dog");
int input = keyboard.nextInt();
Animal pet=null;
if(input == 1){
pet = new Cat();
}
else{
pet = new Dog();
}
这也有助于保持更清洁的方法。
答案 1 :(得分:0)
你需要
Supplier<Pet>
)代码:
Map<Integer, Supplier<Pet>> factories = new HashMap<>();
factories.put(1, Cat::new);
factories.put(2, Dog::new);
Supplier<Pet> defaultPetSupplier = () -> null;
Function<Integer, Pet> f = i -> factories.getOrDefault(i, defaultPetSupplier).get();
System.out.println("Select animal:\n1. Cat\n2. Dog");
int input = keyboard.nextInt();
Pet pet = f.apply(input);
答案 2 :(得分:0)
如果你想避免输入类型,那么你必须做更多的工作。但是你仍然必须使用多态概念。 创建一个名为Pet的接口,并将Pet接口中Cat和Dog类包含的所有方法包含为abstact方法。
class Cat {
public void catMethod1() {
}
public void catMethod2() {
}
}
class Dog {
public void dogMethod() {
}
}
interface Pet {
public void catMethod1();
public void catMethod2();
public void dogMethod();
}
class HelperClass implements Pet {
Cat cat;
Dog dog;
public HelperClass(int input) {
if (input == 1) {
cat = new Cat();
} else {
dog = new Dog();
}
}
@Override
public void dogMethod() {
if (dog == null) {
return;
}
dog.dogMethod();
}
@Override
public void catMethod1() {
if (cat == null) {
return;
}
cat.catMethod1();
}
@Override
public void catMethod2() {
if (cat == null) {
return;
}
cat.catMethod2();
}
}
现在您可以访问没有类型转换的方法。
Pet newpet = new HelperClass(输入);
<强> newpet.catMethod2(); 强>