2013-04-08 67 views
0

我正在用Java實現一個基本的工資計劃。我有一個稱爲Employee的抽象超類,主要存儲稅號,名稱等數據。然後,我有Employee的兩個子類HourlySalaried,它們應該表示員工的類型。這兩個類實現薪酬和稅收的計算,並存儲特定於其員工類型的數據。Java - 試圖理解構圖

麻煩的是,我與田堆最終成爲新的領域需要實現存儲計算的工資,稅收等會我擺脫SalariedHourly並創建一個新的超級說不過去類,PayCalculation,然後有PayHourlyPaySalaried類推斷這實現小時/薪水的特定領域和計算?如果是這樣,在Employee(super class)和PayCalculation(子類)之間是否有構成關係是否合理?

我對構圖沒有很好的理解。如果有人能想出一個更好的方法來構建這個,我會非常感激它。

我不知道如何使用UML,但這裏有一個我在塗料中做的非常低劣的圖表來解釋這一點。

enter image description here

+0

這個環節將是對您有用。 ** http://stackoverflow.com/q/2399544/1115584** – AmitG 2013-04-08 07:30:02

+0

謝謝。我覺得我在使用構圖時感覺不合理(我不確定它是否有一種關係)。然而,我不知道如何以另一種方式構建它。我應該回到以前的結構嗎? – 2013-04-08 07:35:39

回答

1

EmployeeSalaried(Employee)Hourly(Employee)非常適合用作類。

PayCalculation(),PayHourly()PaySalaried()聽起來更像是方法雖然吧?

所以你可以做的是在超類(Employee)中創建一個抽象方法(意思是你沒有實際實現它)PayCalculation()。然後你可以(並且確實必須)在你的薪水和小時課上寫下PayCalculation()的實施。

這意味着,當您在Hourly對象上調用PayCalculation()時,它將完成與您在Salaried對象上調用PayCalculation()時完全不同的事情。

這是否有意義?真正深入地思考這些概念 - 試圖掌握繼承的概念,實際上是試圖把握面向對象編程的概念。

請讓我知道,如果我能以不同的方式解釋任何事情 - 不久前我還在圍繞着這些相同的概念。

另外,您在上面的評論中是正確的。 Employee和Hourly/Salaried之間沒有「有」關係。他們之間存在的關係是「是一種」關係:小時工員工是員工。這意味着你需要考慮繼承,而不是組合 - 這正是我們在這裏討論的。

這應該是這個問題的結論:你試圖把握的是繼承,而不是構圖。

+0

謝謝,這是我以前的。我的Employee類中有10個字段最終會結束嗎? – 2013-04-08 07:41:11

+0

不是。在。所有。有趣的是,我記得在我的第一個程序中有一個同樣的擔憂(實際上它與這個程序非常相似)。當我問我的教授這個同樣的問題時,他告訴我,沒有太多的領域普遍「太多」或「太少」。對於任何給定班級而言,適當的人數是需要的 - 不多也不少。 – drewmoore 2013-04-08 07:43:20

+0

好的,很酷!我猜如果我結束了bajillions(我不會),我可以將數據存儲在某種數據結構中。 – 2013-04-08 07:44:24

2

是的,它做有意義有EmployeePayCalculation之間組成rel'ship。 以實用的方式思考此問題,因爲 - Employee將具有payCalculations,workingHourCalculations等作爲字段/組合,但不是其他方式。

Employee可以有抽象方法來計算工資,工作等需要員工的實例字段可以容納的成員來計算工資,工作等

Public Employee { 
    private Map payCalMap; 
    ..... 
    public double calculatePay();  
} 
+0

這看起來也不錯。我不確定我應該執行哪兩個答案。 – 2013-04-08 07:43:16

+0

這只是一個例子。您可以使用任何適合該目的的數據結構類型。或甚至您自己的自定義數據結構實現。 – 2013-04-08 07:48:08

+0

薪酬計算等事情可以放在任何實用程序類中的單獨幫助器方法中。這是因爲計算是常見的,可以重複使用。 – 2013-04-08 07:50:30

2

員工班級將付款計算委託給PayCalculation界面方法calculate()

通過替換此接口的實現,您可以實現不同的行爲。

class Employee { 
    private PayCalculation payCalculation; 
    public Employee(PayCalculation calculation){ 
    this.calculation = calculation; 
    } 

    public void calculatePayment(){ 
    payCalculation.calculate(); 
    } 
} 

public interface PayCalculation{ 
    public void calculate(); 
} 

class PayHourly implements PayCalculation{ 
    public void calculation(){ 
    System.out.println("Hourly-paid"); 
    } 
} 

class PaySalaried implements PayCalculation{ 
    public void calculate(){ 
    System.out.println("Salary-paid"); 
    } 
} 

然後創建2名不同的員工有不同的支付系統:基礎的支付系統

Employee salaryPaidEmployee = new Employee(new PaySalaried()); 
Employee hourlyPaidEmployee = new Employee(new PayHourly()); 

和計算支付:

salaryPaidEmployee.calculatePayment(); 
hourlyPaidEmployee.calculatePayment(); 
+0

謝謝,這看起來也是一個很好的方法。 – 2013-04-08 08:05:46