2017-01-30 2 views
-1

Я новичок в C# и, прежде всего, в ООП и ее принципах. Поэтому у меня есть домашняя работа из моего университета, чтобы внедрить «банковскую систему». У меня есть депозитные, ипотечные и кредитные счета, а также клиенты, которые должны быть индивидуальными или компаниями. У меня есть формулы для расчета процентной ставки для каждой учетной записи, но она не важна в данный момент, потому что я думаю, что за моменты это работает нормально. Моя проблема заключается в функции Депозита. Здесь вы можете увидеть мою иерархию:Банковская система Депозит/снятие системы

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 only DepositCccounts разрешено снимать, и когда я создаю экземпляр учетной записи, такой как Account depo = new DepositAccount(individual, 400, 0.7);, функция Withdraw ушла. Должен ли я сделать Withdraw виртуальным? Но мне нужно только это для DepositAccounts. Я так растерялся.

+0

Обратите внимание, что это слишком много кода. Вы могли бы (должны) удалить все материалы интереса, по крайней мере. Но все же, лучше, чем слишком мало кода. –

+0

Одной технической проблемой, которая выделяется, является «частный» сеттер на Балансе. Для Withdraw() для работы он должен быть «защищен». –

+0

Для вашего выбора дизайна, рассмотрите размещение на сайте CodeReview. Вы получите меньше downvotes. –

ответ

0

Проблема заключается в том, что я добавляю какую-то сумму в любую учетную запись, она возвращает то же, что и старый. Я имею в виду, когда я отлаживаю это действительно 10999, но я печатаю 10000. Где проблема?

Ваш метод Депозита возвращает значение (которое затем выбрасывается с тех пор, как вы не указали его использование). Вместо этого вы хотите, чтобы ваш метод Депозита сохранял вычисленное значение. Ему ничего не нужно возвращать.

Также для метода Withdraw only DepositCccounts разрешено снимать и когда я создаю экземпляр учетной записи, такой как этот счет depo = new DepositAccount (индивидуальный, 400, 0.7); функция Withdraw отсутствует.

Вы не можете вызвать Withdraw на учетной записи, поэтому, если у вас есть переменная учетной записи, которая тайно хранит объект DepositAccount, вам нужно привести тип к DepositAccount, чтобы выполнить вывод.

1

Ваш метод добавления суммы к учетной записи в основном возвращает сумму двух входов и не сохраняет данные.

Вы должны присвоить новое значение, а затем вернуться, что как так:

this.Balance = this.Balance + amount; 
return this.Balance; 

Что может быть упрощен до одной линии с помощью += оператора:

return this.Balance += amount; 

Для любой другой операции вы должны сделать то же самое, когда вы хотите сохранить эту операцию. Поэтому, когда вы вычитаете сумму с баланса, вы можете:

return this.Balance -= amount; 
Смежные вопросы