2017-09-09 9 views
0

抽象クラス月額料金は、1か月の勤務日数を掛けて計算されます。例えば給与やネット賃金給与控除 の控除計算し、従業員や控除の給与計算給与計算しようとして イム:医師= 10000、教師= 20000、エンジニアを= 30000抽象クラスを使用して計算賃金の計算、控除計算、正味賃金の計算を試みているC#

にしよう私はそれが間違って手に入れたところ、私の質問があり、出力 //

 ID    001 
     Name   J 
     Salary   15750.00 
     Deduction  3386.25 
     Net Pay   12363.75 
 namespace Practice 
    { 

//////////////////////////////////////////// 
//////////////////////////////////////////// 
///////////// class employee /////////////// 
//////////////////////////////////////////// 
//////////////////////////////////////////// 

abstract class Employee 
{ 
    int employeeid; 
    string name; 
    double salary, deduction, daysworked; 
    public Employee() 
    { 

    } 

    public int Employeeid 
    { 
     get { return employeeid; } 
     set { employeeid = value; } 
    } 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    public double Daysworked 
    { 
     get { return daysworked; } 
     set { daysworked = value; } 
    } 

    public double Deduction 
    { 
     get { return deduction; } 
     set { deduction = value; } 
    } 

    public double Salary 
    { 
     get { return salary; } 
     set { salary = value; } 
    } 
    public virtual double calculatesalary() 
    { 
     return Salary * Daysworked; 
    } 
    public virtual double calulatededuction() 
    { 
     return calculatesalary() * Deduction; 
    } 
} 


//////////////////////////////////////////// 
//////////////////////////////////////////// 
///////////// class sample1 /////////////// 
//////////////////////////////////////////// 
//////////////////////////////////////////// 

class sample1 : Employee 
{ 
    public sample1 (string name,int employeeid, double daysworked,double salary) 
    { 
     Name = name; 
     Employeeid = employeeid; 
     Daysworked = daysworked; 
     Salary = salary; 
    } 
    public override double calculatesalary() 
    { 
     if (calculatesalary() <= 10000) 
     { 
      Deduction = 0.11; 
     } 
     if (calculatesalary() >= 10001 && calculatesalary() <= 20000) 
     { 
      Deduction = 0.22; 
     } 
     if (calculatesalary() >= 20001 && calculatesalary() <= 30000) 
     { 
      Deduction = 0.34; 
     } 
     if (calculatesalary() >= 30001) 
     { 
      Deduction = 0.58; 
     } 
     return calculatesalary() * Deduction; 
    } 

    } 
} 

を取得しますか? :

+0

あなたの質問は何ですか? –

+0

どこが間違っていたのですか?それは私の苦労したダブル計算法ですか? –

+0

'calculatealary'はそれ自身を再帰的に呼び出すようです。おそらく、このコードで無限ループに陥るでしょう。おそらく 'base.calculatesalary'を呼び出すことを意味しますか? –

答えて

0

John Wuは、sample1クラスのcalculatesalary()メソッドを再帰的に呼び出すため、無限ループに終わると指摘しています。 base.calculatesalary()を使用すると、基本メソッドが呼び出され、派生クラスで追加ロジックが実行されます。

public override double calculatesalary() 
    { 
     var salary = base.calculatesalary(); 

     if (salary <= 10000) 
     { 
      Deduction = 0.11; 
     } 
     else if (salary >= 10001 && salary <= 20000) 
     { 
      Deduction = 0.22; 
     } 
     else if (salary >= 20001 && salary <= 30000) 
     { 
      Deduction = 0.34; 
     } 
     else if (salary >= 30001) 
     { 
      Deduction = 0.58; 
     } 

     return salary * Deduction; 
    } 

Dan Chaseが述べたように、それはいくつかの修正を必要とするため、このクラスのリファクタリングを検討してください:次のようにあなたの方法を変更します。

関連する問題