我试图掩盖OOP的东西,但我却呆在这里。我在公司课程中遇到错误,员工[0] .setbonus(50)部分。除了定义员工类中的奖励方法外,没有其他方法可以解决它吗?还是在那里将所有对象都放在一个数组中?我定义了奖励方法,但还有另一件事,我必须在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]作为经理施放,但是您必须知道不是很好的解决方案。例如:
Company company= new Company();
Manager manager = Manager.class.cast(employees[0]);
manager.setBonus(50);
System.out.println(manager.getBonus());
或者无论如何都可以将所有对象保存在一个数组中?
您可以迫使您写作:
if ( employees[0] instanceof Manager){
((Manager) employees[0]).setBonus(50);
}
这不是一个好习惯。
在功能上,如果奖金是仅拥有Manager
实例的属性,则Employee
实例不应尝试设置或获得。
当您这样做:
employees[0].setBonus(50);
编译器不知道具体实例。它只看到Employee
。在这个非常简单的代码中,我们直接看到第一个员工是经理,但是在实际应用程序中,该数组可以多次修改。试图记住哪个索引是经理的错误是错误的。如果您需要在A或几个经理上调用特定于管理器的方法,则应确保知道哪些变量是经理。因此,将他们宣布为经理似乎是更自然的方法。
要解决您的问题,两个阵列似乎更有趣:一个适合员工,另一个适用于经理:
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());
}
您的抽象是错误的。您会看到,编译器仅具有 compile time 。
的信息您有一个员工的数组对象。您的代码在运行时间都会将Manager对象放入该数组!编译器不知道。他只知道有一名员工。
,员工类具有 no 方法setBonus()
。因此,您无法称呼该方法!
一个可能的解决方案将是将奖金作为管理器的构造函数的参数。整体认为看起来像这样:
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;
}
注意:
- 您应该避免使用超级类的字段;这些是该类别的私有实施详细信息。儿童课应该不应该关心他们。相反,您可以从超级类调用该方法。
- 另一方面,您应该努力使自己的领域 final 。这使很多事情变得容易得多。
- 当覆盖方法...使用@Override注释!
最后:构造函数是 bad 创建您的"测试数据"的位置。换句话说:您的主要方法是放置创建一系列员工的方法;然后,您只需将其传递到公司的构造函数中。您想清楚地将您的"真实业务逻辑"与主要存在的内容分离为"业务逻辑"。