2017-01-30 5 views
-1

私はC#を初めて、OOPとその原則を念頭に置いています。だから私は大学の宿題を "銀行制度"を実現するために持っています。私には預金、住宅ローン、ローン口座、また個人または企業であるべき顧客があります。私はすべてのアカウントの金利を計算するための式を持っていますが、それは現時点では重要ではありません。なぜなら、これはうまくいきます。私の問題は、デポジット機能です。ここでは、私の階層を見ることができます:銀行システム入金/払い戻し

Account.cs

public abstract class Account 
{ 
    private Customer customer; 
    private double balance; 
    private double interestRate; 

    public Customer Customer { get; private set; } 
    public double Balance { get; private set; } 
    public double InterestRate { get; private set; } 

    public Account(Customer customer, double balance, double interestRate) 
    { 
     this.Customer = customer; 
     this.Balance = balance; 
     this.InterestRate = interestRate; 
    } 



    public abstract double CalculateInterestAmount(int numberOfMonths); 
    public virtual double Deposit(double amount) 
    { 
     return this.Balance + amount; 
    }   
} 

DepositAccount.cs

public class DepositAccount : Account 
{ 
    public DepositAccount(Customer customer, double balance, double interestRate) : base(customer, balance, interestRate) 
    { } 

    public override double CalculateInterestAmount(int numberOfMonths) 
    { 
     double interest = 0.0; 
     if (this.Balance < 1000) 
     { 
      interest = 0.0; 
     } 
     else 
     { 
      interest = numberOfMonths * this.InterestRate; 
     } 
     return interest; 
    } 
    public double Withdraw(double amount) 
    { 

     double result = 0.0; 
     if (amount > this.Balance) 
     { 
      return result = 0.0;   
     } 

     else 
     { 
      result = this.Balance - amount; 
     } 


     return result; 
    } 
} 

LoanAccount.cs

public class LoanAccount : Account 
{ 

    public LoanAccount(Customer customer, double balance, double interestRate) : base(customer, balance, interestRate) { }  

    public override double CalculateInterestAmount(int numberOfMonths) 
    { 
     double interest = 0.0; 

     if (this.Customer is IndividualCustomer) 
     { 
      if (numberOfMonths > 3) 
      { 
       interest = (numberOfMonths - 3) * this.InterestRate; 
      } 
      else 
      { 
       interest = 0.0; 
      } 

     } 

     if (this.Customer is CompanyCustomer) 
     { 
      if (numberOfMonths > 2) 
      { 
       interest = (numberOfMonths - 2) * this.InterestRate; 
      } 
      else 
      { 
       interest = 0.0; 
      } 
     } 

     return interest; 
    } 
} 

MortgageAccount.cs

public class MortgageAccount : Account 
{ 
    public MortgageAccount(Customer customer, double balance, double interestRate) : base(customer, balance, interestRate) 
    { } 


    public override double CalculateInterestAmount(int numberOfMonths) 
    { 
     double interest = 0.0; 
     if (this.Customer is CompanyCustomer) 
     { 
      if (numberOfMonths <= 12) 
      { 
       interest = (numberOfMonths * this.InterestRate)/2; 
      } 
      else 
      { 
       interest = (((12 * this.InterestRate)/2) + ((numberOfMonths - 12) * this.InterestRate)); 
      } 
     } 

     if (this.Customer is IndividualCustomer) 
     { 
      if (numberOfMonths <= 6) 
      { 
       interest = 0.0; 
      } 
      else 
      { 
       interest = (numberOfMonths - 6) * this.InterestRate; 
      } 
     } 

     return interest; 
    } 
} 

メイン

static void Main(string[] args) 
    { 
     //Customers 
     Customer individual = new IndividualCustomer(); 
     Customer company = new CompanyCustomer(); 

     //Accounts 
     Account mort = new MortgageAccount(individual, 2500.0, 0.2);  
     Account depo = new DepositAccount(individual, 400, 0.7); 
     Account loan = new LoanAccount(company, 10000, 3.2); 

     loan.Deposit(999); // this is not working. Balance should be 10999 but it is still 10000 
     Console.WriteLine(loan.Balance); 
     List<Account> accounts = new List<Account>(); 
     accounts.Add(mort); 
     accounts.Add(depo); 
     accounts.Add(loan); 
     Bank b = new Bank(accounts); 
     Console.WriteLine(b.ToString()); 
    } 

問題は、私は任意のアカウントにいくつかの量を追加するとき、それは昔と同じように返しています。私はそれが本当に10999ですが、私は10000を印刷するデバッグを意味します。問題はどこですか?また、Withdrawメソッドの場合、DepositCccountsのみを引き出すことができます。このようなアカウントをインスタンス化すると、Account depo = new DepositAccount(individual, 400, 0.7);という機能が無効になります。 Withdrawをバーチャルにする必要がありますか?しかし、私はDepositAccountsのためだけにそれが必要です。私はとても混乱しています。

+0

コードが多すぎます。あなたは少なくとも興味のものをすべて削除しなければなりませんでした。しかし、依然として、コードは少なすぎます。 –

+0

目立つ1つの技術的な問題は、バランス上の「プライベート」セッターです。撤回()を有効にするには、「保護」する必要があります。 –

+0

デザインの選択肢として、CodeReviewサイトへの投稿を検討してください。あなたはdownvotesを得るより少ないでしょう。 –

答えて

0

問題は、古いものと同じものを返すアカウントにいくらかの金額を追加するときです。私はそれが本当に10999ですが、私は10000を印刷するデバッグを意味します。問題はどこですか?

あなたのデポジットメソッドは値を返しています(これは、何も指定していないために破棄されます)。代わりに、デポジットメソッドが計算した値を保存するようにします。何も返す必要はありません。

また、払い戻しの方法については、預金口座の引き落としが許可されており、このアカウントのような口座をインスタンス化すると、depo = new DepositAccount(個人、400、0.7); Withdraw機能はなくなりました。

あなたは密かにあなたが撤退を実行するためにDepositAccountに型キャストする必要がDepositAccountオブジェクトを保持しているアカウントの変数を持っているので、もし、アカウントの撤回を呼び出すことはできません。

1

アカウントに金額を追加する方法は、基本的に2つの入力の合計を返し、データを保存しないことです。

あなたは、新しい値を代入し、そのようなので、返す必要があります:

+=演算子使用して1行に単純化することができる
this.Balance = this.Balance + amount; 
return this.Balance; 

:あなたが行う必要があり、他のすべての操作について

return this.Balance += amount; 

をその操作を保存する場合も同じです。したがって、天びんから金額を差し引くと、次のことができます。

return this.Balance -= amount; 
関連する問題