0

Java で基本的な給与計算プログラムを実装しています。Employee主に納税者番号、名前などのデータを格納するという抽象スーパークラスがあります。次に、従業員のタイプを表すと思われる 2 つのサブクラスがありEmployeeますHourlySalariedこれら 2 つのクラスは、給与と税金の計算を実装し、従業員の種類に固有のデータを格納します。

問題は、計算された給与、税金などを格納するために新しいフィールドを実装する必要があるため、フィールドの山Salariedになってしまうことです。時給/給与の特定のフィールドと計算を実装するために、これに由来するクラスはありますか? もしそうなら、(スーパークラス)と(サブクラス)の間に合成関係を持つことは理にかなっていますか?HourlyPayCalculationPayHourlyPaySalariedEmployeePayCalculation

構成がよくわかりません。誰かがこれを構造化するためのより良い方法を考えることができれば、私はそれを高く評価します.

UML の使用方法はわかりませんが、これを説明するためにペイントで作成した非常に見苦しい図を次に示します。

ここに画像の説明を入力

4

3 に答える 3

2

Employee のクラスは、支払計算を 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();
于 2013-04-08T07:52:15.227 に答える
2

Employeeはい、 と の間に構成関係があることは理にかなっていますPayCalculation。この問題を実用的な方法で考えてください -フィールド/コンポジションとして などがありますEmployeepayCalculationsworkingHourCalculationsその逆ではありません。

またEmployee、給与や仕事などを計算するための抽象メソッドを持つこともできます。Employee のインスタンス フィールドは、給与や仕事などを計算するために必要なメンバーを保持できます。

Public Employee {
    private Map payCalMap;
    .....
    public double calculatePay();    
}
于 2013-04-08T07:35:32.070 に答える
2

EmployeeSalaried(Employee)およびHourly(Employee)クラスとして完全に適しています。

PayCalculation()PayHourly()、そしてPaySalaried()メソッドのように聞こえますよね?

したがって、できることはPayCalculation()、スーパークラス (従業員) に抽象メソッドを作成することです (つまり、実際には実装しません)。PayCalculation()次に、Salaried クラスと Hourly クラスでの実装を作成できます (実際に作成する必要があります) 。

これは、Hourly オブジェクトで PayCalculation() を呼び出すと、Salaried オブジェクトで PayCalculation() を呼び出す場合とはまったく異なることを行うことを意味します。

これは理にかなっていますか?これらの概念について深く考えてみてください。継承の概念を理解しようとすることは、オブジェクト指向プログラミング全般の概念を理解しようとすることです。

何か違った説明ができるかどうか教えてください - 私がこれらの同じ概念に頭を抱えていたのはつい最近のことです。

また、上記のコメントであなたは正しいです。Employee と Hourly/Salaried の間に「has a」関係はありません。それらの間に存在する関係は「is a」関係です。時間給の従業員は従業員です。これは、合成ではなく、継承について考える必要があることを意味します。これはまさに、ここで話してきたことです。

それがこの質問から得られるはずです。あなたが把握しようとしているのは継承であり、構成ではありません。

于 2013-04-08T07:36:12.610 に答える