首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多态性1超类4子类

多态性1超类4子类
EN

Stack Overflow用户
提问于 2015-12-20 00:42:49
回答 2查看 115关注 0票数 0

假设我有5个类,1个超类和4个子类。我的超类是Animal,有SpeciesCharateristic,这2将继承到我的子类中。

4个子类是:LionEagleBeeWhale (这4个子类扩展了Animal )。这些子类将具有Voice()Walk()方法。

问题是,我的导师告诉它的学生:

案例1.如果该程序正在运行,将有一个菜单显示4个子类/ Animal对象。

案例2.用户选择动物后的,例如:Eagle。然后,它展示了鹰的声音和动作。

案例3.如果用户选择退出,则终止程序。

在这种情况下,我们将使用switch + case,对吗?但是我的问题是如何从我的超类中调用这4个子类?

如果我在每个子类中添加public static void main,那么这4个子类将成为一个main方法,并且我无法用switch大小写来设置或创建它。还是必须创建另一个类来扩展这4个子类并调用它?

谢谢,我希望你能理解我的意思:)

EN

回答 2

Stack Overflow用户

发布于 2015-12-20 01:00:18

您应该通过虚拟方法调用(在为超类键入的引用上)访问子类方法。您也可以使用工厂设计模式。可能是这样的:

代码语言:javascript
复制
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()方法的样子:

代码语言:javascript
复制
Animal * getAnimal(int choice)
{
    switch (choice)
    {
    case 1:
        return new Lion();
    case 2:
        return new Eagle();
    // etc.
    default:
        // invalid choice
        return null;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-12-20 01:06:39

在某种程度上,您必须创建您的动物实例。

代码语言:javascript
复制
Animal a1 = new Lion();
Animal a2 = new Eagle();
System.out.println(a1.Species());
System.out.println(a2.Species());

创建一个单独的类来控制包含主程序的程序。

代码语言:javascript
复制
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
    }
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34376911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档