【问题标题】:Polymorphism - Call Base class function多态性 - 调用基类函数
【发布时间】:2011-12-17 10:49:24
【问题描述】:

是否可以在不修改基类和派生类的情况下调用基类函数?

class Employee {
    public String getName() {
        return "Employee";
    }

    public int getSalary() {
        return 5000;
    }
}

class Manager extends Employee {
    public int getBonus() {
        return 1000;
    }

    public int getSalary() {
        return 6000;
    }
}

class Test {
    public static void main(String[] args) {
        Employee em = new Manager();
        System.out.println(em.getName());
        // System.out.println(em.getBonus());
        System.out.println(((Manager) em).getBonus());
        System.out.println(em.getSalary());
    }
}

输出: 员工 1000 6000

如何在em 对象上调用Employee 的getSalary() 方法?

【问题讨论】:

标签: java inheritance polymorphism


【解决方案1】:

你不能。如果您愿意,可以向Manager 添加这样的方法:

public int getEmployeeSalary()
{
    return super.getSalary();
}

【讨论】:

  • 不;原始发布者想要获取该方法返回的值。也许EmployeeManager 只是这里的示例类,我们实际上是在更笼统地谈论调用被覆盖的方法。
  • 在更一般的术语中,OP 想要打破多态性,这只是错误。在这种情况下,明显缺失的部分是经理和员工之间的多对多关联。
  • 我很确定这些只是示例,但与其说是“他的员工的薪水”,还可以是“如果他不是经理,他会得到的薪水”,并且在这种情况下,理论上这是一件合法的事情。但这个决定是而且应该由Manager 的实现者来决定,而不是由某个随机的客户来决定,这就是为什么如果没有那个实现者的合作就没有办法做到这一点。
  • 所以最后不可能在不改变 Manager 类的情况下做到这一点!!但正如所指出的,我会打破多态性。我好奇地问。
【解决方案2】:

改用 Employee 对象:

Employee em = new Employee();

【讨论】:

  • 我想使用现有的em 对象。
【解决方案3】:

您可以从子类中调用超类的方法。

class Manager extends Employee {
    public int getBonus() {
    return 1000;
    }

    public int getSalary() {
    return super.getSalary();
    }
}

【讨论】:

  • 请阅读我的问题。无需更改员工或经理代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
相关资源
最近更新 更多