所以我有3个子类(Cat
,Dog
和Fish
),我必须询问用户他们有多少宠物(n),宠物的类型和所有该宠物的信息(名称和年龄是超类的一部分,但每个子类有两个唯一的字段)。我的问题是如何将每个"宠物"并为它创建一个类对象。我显然有点卡住,任何帮助表示赞赏。
答案 0 :(得分:1)
您可以使用工厂模式进行多态:
public abstract class Pet {
private String name;
private int age;
protected Pet(String name, int age) {
setName(name);
setAge(age);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Dog extends Pet {
public Dog(String name, int age, param3, param4) {
super(name, age);
}
}
public class Cat extends Pet {
public Cat(String name, int age, param3, param4) {
super(name, age);
}
}
public class Fish extends Pet {
public Fish(String name, int age, param3, param4) {
super(name, age);
}
}
public class PetFactory {
public Pet newPet(String petType, String name, int age, param3, param4) throws IllegalArgumentException {
if ("Dog".equalsIgnoreCase(petType))
return new Dog(name, age, param3, param4);
if ("Cat".equalsIgnoreCase(petType))
return new Cat(name, age, param3, param4);
if ("Fish".equalsIgnoreCase(petType))
return new Fish(name, age, param3, param4);
throw new IllegalArgumentException("Unknown pet: " + petType);
}
}
答案 1 :(得分:0)
如果你有一个框架UI,你可以创建一个单选按钮组来选择宠物参数的类型和文本框(当然,你需要检查用户输入并给出反馈)。最好在标签上提供数据限制。 如果您使用控制台,为宠物选择,为用户提供在“猫”,“狗”,“鱼”等之间进行选择的机会。还提供您对其他参数的限制。控制他的意见并提供反馈。 有很多方法可以实现它,指明你的愿景。
答案 2 :(得分:0)
看一下decorator模式。
abstract class Pet {}
abstract class PetDecorator extends Pet {
void initialize() {
// read name and age from console
}
}
class CatDecorator extends PetDecorator {
@Override
void initialize() {
super.initialize();
// read cat specific fields
}
}
// other classes omited for brevity
// inside Main
List<Pet> readInfoAboutPets(int numberOfPets) {
List<Pet> pets = new ArrayList<>(numberOfPets);
for (int i = 0; i < numberOfPets; i++) {
// read pet type from console
switch (petType) {
case "cat":
PetDecorator petDecorator = new CatDecorator();
petDecorator.initialize();
pets.add(petDecorator);
break;
// case rest
}
}
return pets;
}