Я новичок в 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. Я так растерялся.
Обратите внимание, что это слишком много кода. Вы могли бы (должны) удалить все материалы интереса, по крайней мере. Но все же, лучше, чем слишком мало кода. –
Одной технической проблемой, которая выделяется, является «частный» сеттер на Балансе. Для Withdraw() для работы он должен быть «защищен». –
Для вашего выбора дизайна, рассмотрите размещение на сайте CodeReview. Вы получите меньше downvotes. –