2. Sinflarni yaratish 1-qism.
BankLibrary loyihasiga quyidagi ta’rifga ega bo‘lgan yangi Hisob sinfini qo‘shamiz:
namespace BankLibrary
{
public abstract class Account : IAccount
{
static int counter = 0;
protected int _days = 0
public Account(decimal sum, int percentage)
{
Sum = sum;
Percentage = percentage;
Id = ++counter;
}
// Joriy hisob balansi ommaviy
public decimal Sum { get; private set; }
//Hisoblash foizi
public int Percentage { get; private set; }
// Hisob indifikatori
public int Id { get; private set; }
//Chaqiruv
private void CallEvent(AccountEventArgs e, AccountStateHandler handler)
{
if (e != null)
handler?.Invoke(this, e);
}
// indivudal hodisalarni chaqirish
protected virtual void OnOpened(AccountEventArgs e)
{
CallEvent(e, Opened);
}
protected virtual void OnWithdrawed(AccountEventArgs e)
{
CallEvent(e, Withdrawed);
}
protected virtual void OnAdded(AccountEventArgs e)
{
CallEvent(e, Added);
}
protected virtual void OnClosed(AccountEventArgs e)
{
CallEvent(e, Closed);
}
protected virtual void OnCalculated(AccountEventArgs e)
{
CallEvent(e, Calculated);
}
public virtual void Put(decimal sum)
{
Sum += sum;
OnAdded(new AccountEventArgs("hisob " + sum, sum));
}
// yechib olish ohangi ,hisobdan qancha pul yechib olinganligini qaytaradi
public virtual decimal Withdraw(decimal sum)
{
decimal result = 0;
if (Sum >= sum)
{
Sum -= sum;
result = sum;
OnWithdrawed(new AccountEventArgs($"summa {sumhisob{Id}", sum));
}
else
{
OnWithdrawed(new AccountEventArgs($"{Id}", 0));
}
return result;
}
// hisobni ochish
protected internal virtual void Open()
{
OnOpened(new AccountEventArgs($"yangi hisobni ochish! Id счета: {Id}", Sum));
}
// hisobni yopish
protected internal virtual void Close()
{
OnClosed(new AccountEventArgs($"Счет {Id} yopiq jami summa: {Sum}", Sum));
}
protected internal void IncrementDays()
{
_days++;
}
// kasrli natija
protected internal virtual void Calculate()
{
decimal increment = Sum * Percentage / 100;
Sum = Sum + increment;
OnCalculated(new AccountEventArgs($"kasr foizi va razmeri: {increment}", increment));
}
}
}
Bunday bank hisobvarag'i mavjud emasligi sababli, lekin aniq hisoblar mavjud - depozit, talab va boshqalar, bu sinf mavhumdir. Shu bilan birga, u IAccount interfeysini amalga oshiradi.U holat o'zgarganda ishdan chiqadigan hodisalar to'plamini belgilaydi. Oldindan yaratilgan AccountStateHandler delegati voqealarni aniqlash uchun ishlatiladi.Har bir hisob o'ziga xos identifikatorga ega - noyob raqam. Uni olish uchun statik hisoblagich taymeridan foydalaniladi.Deyarli barcha usullar virtualdir. Avvalo, generatsiya usullari aniqlanadi. Usul CallEvent()AccountStateHandler delegatini ifodalovchi hodisani keltirib chiqaradi va unga voqea argumentlarini - AccountEventArgs ob'ektini uzatadi. CallEvent usuli yordamida alohida hodisalarni chaqirish uchun OnAdded, OnCalculated, OnClosed, OnOpened, OnWithdrawed usullari taqdim etiladi. Hodisa chaqiruvining bunday tashkil etilishi olingan sinflarda chaqiruv modelini bekor qilishni va har bir olingan sinf uchun turli AccountEventArgs obyektlarini o‘tkazishni osonlashtiradi.Ushbu usullar hisobning funksionalligi uchun javobgar bo'lgan usullar ichida deyiladi. Misol uchun, Put usuli hisobvaraqga mablag'larni kiritish mantiqini saqlaydi. Va bu usulda OnAdded()hodisa qo'ng'iroq orqali yaratiladi Added.Shuni ham ta'kidlash kerakki, ko'pchilik sinf a'zolari modifikatorga ega protected internal, ya'ni ular faqat BankLibrary loyihasi ichida ko'rinadi.Hisob mavhum sinfi meros qilib olingan yoki olingan sinflar tomonidan bekor qilingan polimorfik interfeysni belgilaydi. Endi loyihaga talab hisobini ifodalovchi va DemandAccount deb ataladigan yangi sinf qo'shamiz :
public class DemandAccount : Account
{
public DemandAccount(decimal sum, int percentage) : base(sum, percentage)
{
}
protected internal override void Open()
{
base.OnOpened(new AccountEventArgs($"yangi hisob ochish! Id hisob: {this.Id}", this.Sum));
}
}
Bu sinf bitta Open usulini bekor qiladi. Agar xohlasangiz, siz ko'proq funksionallikni qayta belgilashingiz mumkin, ammo bu holda biz o'zimizni shu bilan cheklaymiz.Shuningdek, DepositAccount ni meros qilib olgan ikkinchi sinfni qo'shing :
public class DepositAccount : Account
{
public DepositAccount(decimal sum, int percentage) : base(sum, percentage)
{
}
protected internal override void Open()
{
base.OnOpened(new AccountEventArgs($"yangi depozit hisobi! Id summa: {this.Id}", this.Sum));
}
public override void Put(decimal sum)
{
if (_days % 30 == 0)
base.Put(sum);
else
base.OnAdded(new AccountEventArgs("hisobni faqat 30 kundan keyin ochish mumkin", 0));
}
public override decimal Withdraw(decimal sum)
{
if (_days % 30 == 0)
return base.Withdraw(sum);
else
base.OnWithdrawed(new AccountEventArgs("Pulni yechib olish faqat 30 kunlik muddatdan so’ngamalga oshishi mumkin ", 0));
return 0;
}
protected internal override void Calculate()
{
if (_days % 30 == 0)
base.Calculate();
}
}
Depozit hisobvaraqlarining o'ziga xos xususiyati bor: ular uzoq muddatga chiqariladi, bu esa ba'zi cheklovlarni keltirib chiqaradi. Shuning uchun, bu erda yana uchta usul bekor qilinadi. Aytaylik, depozit hisobvarag'i 30 kunlik muddatga ega bo'lib, bu muddat ichida mijoz na hisob raqamiga qo'shishi, na hisobvaraqdagi mablag'larning bir qismini yechib olishi mumkin, faqat butun hisobni yopishdan tashqari. Shuning uchun, barcha operatsiyalar uchun biz ushbu hisob uchun o'tgan kunlar sonini tekshiramiz:
if (_days % 30 == 0)
Bunday holda, biz kunlar sonini 30 kunga bo'lishning qolgan qismini taqqoslaymiz. Agar bo'linishning qolgan qismi 0 bo'lsa, keyingi 30 kunlik muddat o'tdi, uning oxirida foizlar hisoblab chiqiladi, pul mablag'larini olish yoki ularni qo'shish mumkin.Aslida, bu biz dasturda foydalanadigan bank hisoblarining barcha sinflari.
Do'stlaringiz bilan baham: |