2016-12-15 118 views
3

我想要覆盖面向对象的东西,但我卡在这里。我在公司类员工[0] .setBonus(50)部分中遇到错误。除了在Employee类中定义Bonus方法之外,没有其他解决方法吗?或者有无法将所有对象保存在一个数组中?我定义了奖励方法,但还有一件事,我必须在Empoyee类的getBonus方法中返回?在java中创建超类的类型的子类对象


    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

[调用从超类的子类方法]的可能的复制(http://stackoverflow.com/questions/10021603/calling-a-subclass-method-from-superclass) – shmosel

回答

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());  
    } 
0

你的抽象是错误的。你看,编译器只有编译时间为的信息可用

您有一组雇员对象那里。不要紧,你的代码运行时间将把管理器对象放入该数组!编译器不知道这一点。他只知道有一名员工。

而员工类别有方法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; 
    } 

注:

  • 你应该避免使用你的超类的领域;那些是私人该类的实现细节。儿童班应该不是关心他们。相反,你可以从超级类中调用该方法。
  • 另一方面,你应该努力使你的领域最终。这使得很多事情变得更容易。
  • 覆盖方法...使用@Override注释!

最后:构造函数是不好的创建“测试数据”的地方。换句话说:您的主要方法是创建一系列员工;然后你只需传入你的公司构造函数。你想清楚地将你的“真实的商业逻辑”与那些主要存在的东西区分开来,测试那个“商业逻辑”。

2

如果你真的想这样做,你可以投员工[0]作为经理,但你必须知道是不是很好的解决方案。 E.g:

Company company= new Company(); 
    Manager manager = Manager.class.cast(employees[0]); 
    manager.setBonus(50); 
    System.out.println(manager.getBonus());