假设我有5个类,1个超类和4个子类。我的超类是Animal,有Species和Charateristic,这2将继承到我的子类中。
4个子类是:Lion、Eagle、Bee和Whale (这4个子类扩展了Animal )。这些子类将具有Voice()和Walk()方法。
问题是,我的导师告诉它的学生:
案例1.如果该程序正在运行,将有一个菜单显示4个子类/ Animal对象。
案例2.用户选择动物后的,例如:Eagle。然后,它展示了鹰的声音和动作。
案例3.如果用户选择退出,则终止程序。
在这种情况下,我们将使用switch + case,对吗?但是我的问题是如何从我的超类中调用这4个子类?
如果我在每个子类中添加public static void main,那么这4个子类将成为一个main方法,并且我无法用switch大小写来设置或创建它。还是必须创建另一个类来扩展这4个子类并调用它?
谢谢,我希望你能理解我的意思:)
发布于 2015-12-20 01:00:18
您应该通过虚拟方法调用(在为超类键入的引用上)访问子类方法。您也可以使用工厂设计模式。可能是这样的:
int choice;
// read the choice, if exit chosen then exit
// getAnimal returns the actual animal instance
// (either a new instance or an existing one from internal registry)
// can select by switch() inside
Animal *animal = getAnimal(choice); // or Animal::getAnimal(choice), etc.
if (animal == null) {
System.err.println("Invalid choice");
} else {
// will call the methods on the actual specific animal retrieved by getAnimal()
animal.Voice();
animal.Walk();
}动物类和动物类都不应该只有main() --只有处理整个逻辑的实际应用程序(也可以是动物类,但最好为应用程序本身创建一个单独的类)。
编辑:--这就是getAnimal()方法的样子:
Animal * getAnimal(int choice)
{
switch (choice)
{
case 1:
return new Lion();
case 2:
return new Eagle();
// etc.
default:
// invalid choice
return null;
}
}发布于 2015-12-20 01:06:39
在某种程度上,您必须创建您的动物实例。
Animal a1 = new Lion();
Animal a2 = new Eagle();
System.out.println(a1.Species());
System.out.println(a2.Species());创建一个单独的类来控制包含主程序的程序。
public class MyClass {
public static void main(String[] args) {
int opt = 1; // TODO - use args
switch (opt) {
case 1:
Lion obj = new Lion();
System.out.println("Voice: " + obj.Voice() + ", Walk: " + obj.Walk();
break;
case 2:
Eagle obj = new Eagle();
System.out.println("Voice: " + obj.Voice() + ", Walk: " + obj.Walk();
break;
// etc
}
}
}https://stackoverflow.com/questions/34376911
复制相似问题