我试图报道OOP的东西,但我坚持到这里。我在公司类中遇到错误,员工[0] .setBonus(50)部分。除了在Employee类中定义Bonus方法之外,还有其他方法可以解决它吗?或者无论如何将所有对象保存在一个数组中?我定义了奖励方法,但还有另外一件事,我必须在Empoyee课程中返回' getBonus方法?
public class Company
{
private static Employee[] employees;
public Company()
{
employees= new Employee[]{new Manager("Sapo",10000),new Employee("James",5000),new Employee("Jessie",5001)};
}
public static void main(String[] args)
{
Company company= new Company();
employees[0].setBonus(50);
System.out.println(employees[0].getBonus());
}
}
public class Employee extends Person
{
int salary;
public Employee(String name,int salary) {
super(name);
setSalary(salary);
// TODO Auto-generated constructor stub
}
public void setSalary(int salary)
{
this.salary= salary;
}
public int getSalary()
{
return salary;
}
}
public class Manager extends Employee
{
private int bonus;
public Manager(String name, int salary) {
super(name, maas);
}
public void setBonus(int bns)
{
bonus=bns;
}
public int getBonus()
{
return bonus;
}
public int getSalary()
{
return salary+bonus;
}
}
我很困惑。
答案 0 :(得分:2)
或者无论如何将所有对象保存在一个数组中?
你可以,但它会强迫你写:
if ( employees[0] instanceof Manager){
((Manager) employees[0]).setBonus(50);
}
这不是一个好习惯。
从功能上讲,如果奖金是仅拥有Manager
个实例的属性,则Employee
实例不应尝试设置或获取它。
当你这样做时:
employees[0].setBonus(50);
编译器不知道具体实例。它只看到Employee
。
在这个非常简单的代码中,我们直接看到第一个员工是经理,但在实际应用程序中,数组可能会被多次修改。试图记住哪些索引是管理者容易出错。如果您需要在一个或多个经理上调用经理特定的方法,您应该确定知道哪些变量是经理。所以宣称他们是经理似乎是更自然的方式。
为了解决您的问题,两个阵列似乎更有趣:一个用于员工,另一个用于管理员:
private static Employee[] employees;
private static Manager[] managers;
现在你可以做到:
public Company()
{
employees= new Employee[]{new Employee("James",5000),new Employee("Jessie",5001)};
managers= new Employee[]{new Manager("Sapo",10000)};
}
public static void main(String[] args){
Company company= new Company();
managers[0].setBonus(50);
System.out.println(managers[0].getBonus());
}
答案 1 :(得分:2)
如果你真的想这样做,你可以将员工[0]作为经理,但你必须知道不是很好的解决方案。 E.g:
Company company= new Company();
Manager manager = Manager.class.cast(employees[0]);
manager.setBonus(50);
System.out.println(manager.getBonus());
答案 2 :(得分:0)
你的抽象是错误的。你看,编译器只有编译时可用的信息。
您有一系列员工对象。您在运行时的代码将Manager对象放入该数组并不重要!编译器不知道这一点。他只知道有一个员工。
Employee类有否方法setBonus()
。因此,你无法调用该方法!
一种可能的解决方案是将奖金作为Manager的构造函数的参数;整个想法可能看起来像这样:
public class Manager extends Employee {
private final int bonus;
public Manager(String name, int salary, int bonus) {
super(name, salary);
this.bonus = bonus;
}
@Override
int getSalary() {
return super.getSalary() + bonus;
}
注意:
最后:构造函数是错误的位置,用于创建“测试数据”。换句话说:您的主要方法是创建该员工阵列;然后你只需传递到你的公司构造函数中。您希望清楚地将您的“真实业务逻辑”与主要存在于 test 那些“业务逻辑”的东西分开。