【问题标题】:Don't understand how to override parent function from subclass不明白如何从子类覆盖父函数
【发布时间】:2014-05-08 05:19:00
【问题描述】:

我遇到了一个问题。我有一个菜单驱动的计算器。我的计算器类包含方法 displayMenu();看起来像

public static int displayMenu(){

    Scanner input=new Scanner(System.in);

    int choice=0;
    do{
    System.out.println("1.Add");
    System.out.println("2.Subtract");
    System.out.println("3.Multiply");
    System.out.println("4.Divide");
    System.out.println("5.Clear");
    System.out.println("6.Quit");
    System.out.println("What would you like to do?");
    }while(!input.hasNextInt());
    choice=input.nextInt();
    return choice;
}

我被要求创建一个名为 ScientificMemCalc 的子类。子类应该使用继承的力量向我的菜单添加新选项。新的打印输出应该看起来像

菜单 1.添加 2.减法 3. 相乘 4.划分 5. 电源 6. 对数 7.清除 8.退出

你想做什么?

我知道开始

public class ScientificMemCalc extends MC{

}

但我不明白如何覆盖 displayMenu() 函数以显示新选项。我想我知道如何为新选项添加​​功能,但是如何在不重写子类中的整个方法的情况下更改打印输出?

【问题讨论】:

  • 如果摸不到MC,只能重写整个方法。

标签: inheritance polymorphism parent-child subclass


【解决方案1】:

尽量将您正在显示的内容(即菜单项字符串列表)与实际显示它们的代码分开。

在您编写的代码中,菜单项字符串列表在您的显示代码中为hardcoded,您可以将其视为对System.out.println 函数的调用。

System.out.println("1. ...");
System.out.println("2. ...");

除了修改调用System.out.println的代码之外,没有办法向列表中添加另一个项目。

您需要做的是将菜单项(字符串列表)存储在某种数据结构中(例如 arraylistmap)。然后有一些显示代码从数据结构中读取项目并使用System.out.println() 显示它们。

你正在创造:

  1. 一种存储菜单项字符串的数据结构。您有很多选择:arrayslistsmaps

  2. 读取您创建的数据结构并将菜单项打印到屏幕上的函数。

比较

System.out.println("1. menu item choice1");

与:

String[] menuitems = new String[]{"1. menu item choice1", "2. menu item choice2"};

for(String item : menuitems) System.out.println(item);

现在您可以向菜单项数组添加内容,它们将在 for 循环中自动打印。

class MC {
    protected String[] menuitems = new String[]{"1. menu item choice1", "2. menu item choice2"};

    public void displayMenu() {
        for(String item : menuitems) System.out.println(item);
    }
}

现在,如果您将 MC 子类化,您可以更改菜单项。 displayMenu() 将显示您的更改。

您可能还想考虑:

  1. 一个接受菜单项字符串并将其添加到数据结构中的函数
  2. 读取用户输入的函数
  3. 另一种数据结构,可将您的菜单项映射到实现它们的实际功能。

最后一个实际上可能是存储菜单项的相同数据结构。事实上,您可能想考虑如何映射菜单项字符串、用户输入 (int) 和被调用的函数。

【讨论】:

  • 您正在描述一种称为“单一责任原则”的东西,它说:“一种方法应该只有一个改变的理由。” user3342994 的 displayMenu() 函数至少有三个改变的原因:改变菜单格式、改变菜单内容、改变用户与菜单的交互方式。
猜你喜欢
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多