在Java中的哪种类型的超级类别中创建子类对象



我试图掩盖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 创建您的"测试数据"的位置。换句话说:您的主要方法是放置创建一系列员工的方法;然后,您只需将其传递到公司的构造函数中。您想清楚地将您的"真实业务逻辑"与主要存在的内容分离为"业务逻辑"。

最新更新