2014-12-07 99 views
0

我想寫一個類(SalaryEmployee)和子類(ComissionEmployee),但我沒有得到正確的薪水在主,我不能做一個se1.setSalesAmount(20000)。我哪裏做錯了?繼承Java子類

這就是在主:

public static void main(String[] args) { 
    SalaryEmployee se1 = new CommissionEmployee("E3", "John", 10000); 
    se1.setSalesAmount(20000) // not found 
    System.out.println(se1.getSalary()); 

} 

SalaryEmployee具有ID(字符串),姓名(字符串),(雙薪)。它有一個構造函數來初始化實例變量。它有一個返回工資的getSalary方法以及一個返回實例變量值的toString方法。

public class SalaryEmployee { 
    private String id; 
    private String name; 
    double salary; 

    public SalaryEmployee(String id, String name, double salary) { 
     this.id = id; 
     this.name = name; 
     this.salary = salary; 
    } 

    public double getSalary() { 
     return salary; 
    } 

    public String toString() { 
     return "ID=" + id + " Name=" + name + " Salary=" + salary; 
    } 
} 

然後在ComissionEmployee我需要把它寫成SalaryEmployee的子類,具有ID(字符串),姓名(字符串),baseSalary(雙),SalesAmount兩個(雙)。它只有一個構造函數來初始化id,name和baseSalary。它具有salesAmount的get/set方法。它具有的getSalary方法如下返回基於baseSalary +提成工資:

SalesAmount兩個低於10,000 - 無佣金, 至少10,000,但低於20,000 - 3%baseSalary的, 至少20,000 - 5% baseSalary

public class CommissionEmployee extends SalaryEmployee { 

    private double baseSalary; 
    private double salesAmount; 

    public CommissionEmployee(String id, String name, double salary) { 
     super(id, name, salary); 
     this.baseSalary = salary; 

    } 

    public void setSalesAmount(double amount) { 
     this.salesAmount = amount; 
    } 

    public double getSalesAmount() { 
     return salesAmount; 
    } 

    public double getSalary() { 
     if (salesAmount <= 10000 || salesAmount < 20000) { 
      return 1.03 * baseSalary; 
     } else if (salesAmount > 20000) { 
      return 1.05 * baseSalary; 
     } else if (salesAmount < 10000) { 
      return baseSalary; 
     } 
     return baseSalary; 
    } 
} 
+2

您能否給我們您的預期結果VS結果?告訴我們結果是錯誤的是一件事,告訴我們結果是另一回事。 – Juxhin 2014-12-07 17:31:08

回答

0

而不是

SalaryEmployee se1 = new CommissionEmployee("E3", "John", 10000); 

CommissionEmployee se1 = new CommissionEmployee("E3", "John", 10000); 

方法setSalesAmount僅適用於CommissionEmployee,它不在父類SalaryEmployee中。所以這個方法是特定於孩子的,只有它可用。除上述之外,您的情況似乎無效。你應該這樣做:

if (salesAmount == 0) { 
    return baseSalary; 
} else if (salesAmount < 20000) { 
    return 1.2 * baseSalary; 
} else if (salesAmount >= 20000) { 
    return 1.05 * baseSalary; 
} 
+0

我試過你的方法,但如果我不做setSalesAmount,它返回10300,我怎樣才能返回原始工資,因爲沒有銷售額設置? – ags 2014-12-07 17:36:44

+0

更新了答案。似乎有重複的,如果在你的代碼的條件。 – SMA 2014-12-07 17:41:17

0

你創造SE1作爲不具有setSalesAmount()方法SalaryEmployee類型。 所以,你需要你的向下轉換SE1至CommissionEmployee:

((CommissionEmployee)se1).setSalesAmount(20000) 
0

在你的代碼se1仍然有它的基本類型SalaryEmployee其中setSalesAmount方法不存在。

我會說你的程序設計的很糟糕。

0

有了繼承和與接口左側有分配的一面,無論是基於基準上的方法是在編譯time.so解決時,你說

SalaryEmployee se1 = new CommissionEmployee("E3", "John", 10000); 
se1.setSalesAmount(20000); 

編譯器將設法找到setSalesAmount方法在參考類型,即:SalaryEmployee而不是實例類型即:CommissionEmployee

在運行時,當您的代碼執行的方法上,以該基準點至即在實例上執行的:CommissionEmployee的實例,因此它會選擇第setSalesAmount e子類來執行。

我們解決您的problemthere兩種方式做到這一點:

  • 要麼你做 CommissionEmployee SE1 =新CommissionEmployee( 「E3」, 「約翰」,10000); se1..setSalesAmount(20000); 但那不是傳承純Java編寫的理念被使用。因此,正確的方法是:

  • 在您的超類中包含setSalesAmount方法以及默認實現。

  • 如果您不打算直接創建SalaryEmployee實例,那麼甚至可以在超類中包含抽象方法setSalesAmount,即:由於抽象類無法自行實例化,因此永遠不會在任何地方執行新的SalaryEmployee()。

希望這會有所幫助。