簡體   English   中英

在數組中創建子類對象,在java中使用哪種類型的超類

[英]Creating subclass object in an array which type of superclass in java

我試圖覆蓋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;
}
}

我糊塗了。

或者無論如何將所有對象保存在一個數組中?

你可以,但它會迫使你寫:

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]作為經理,但你必須知道這不是一個好的解決方案。 例如:

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

你的抽象是錯誤的。 你看,編譯器只有編譯時可用的信息。

那里有一組Employee對象。 運行時的代碼將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;
  }

筆記:

  • 你應該避免使用超類的字段; 這些是該類的私有實現細節。 兒童類應該關心他們。 相反,您可以從超類中調用該方法。
  • 另一方面,你應該努力使你的領域最終 這使得很多事情變得更容易。
  • 覆蓋方法時......使用@Override注釋!

最后:構造函數是創建“測試數據”的不好的地方。 換句話說:您的主要方法是創建該員工陣列; 然后你只需傳遞給你的Company構造函數。 您希望將“真實業務邏輯”與主要用於測試 “業務邏輯”的內容明確區分開來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM