![](/img/trans.png)
[英]Java: using setter of a subclass when creating an object of type Superclass
[英]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;
}
筆記:
最后:構造函數是創建“測試數據”的不好的地方。 換句話說:您的主要方法是創建該員工陣列; 然后你只需將它傳遞給你的Company構造函數。 您希望將“真實業務邏輯”與主要用於測試 “業務邏輯”的內容明確區分開來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.