}
// id topilmadi
public T FindAccount(int id)
{
for (int i = 0; i < accounts.Length; i++)
{
if (accounts[i].Id == id)
return accounts[i];
}
return null;
}
// hisobni qaytadan qidirish
public T FindAccount(int id, out int index)
{
for (int i = 0; i < accounts.Length; i++)
{
if (accounts[i].Id == id)
{
index = i;
return accounts[i];
}
}
index = -1;
return null;
}
}
Bank sinfi umumiydir. Shu bilan birga, T parametri cheklovga ega: u, albatta, Hisob sinfini yoki uning avlodlarini ifodalashi kerak. Shuning uchun, har qanday T ob'ekti uchun biz Account sinfining usullari va xususiyatlaridan foydalanish imkoniyatiga ega bo'lamiz.Sinfdagi barcha hisoblar massivda saqlanadi accounts. Sinfni loyihalash vaqtida biz bank qaysi hisoblarni boshqarishini bilmasligimiz mumkin. Ehtimol, bu har qanday hisoblar yoki faqat depozit hisoblari, ya'ni DepositAccount ob'ektlari bo'lishi mumkin. Shuning uchun, generiklardan foydalanish sizga ko'proq moslashuvchanlikni qo'shish imkonini beradi.Usulda yangi hisob yaratishda , ushbu usulga Openbir qator parametrlar, xususan, sanab o'tilgan hisob turiga o'tkaziladi:
public enum AccountType
{
Ordinary,
Deposit
}
Bu raqam Bank sinfidan keyin aniqlanishi mumkin. Hisob turiga qarab, DemandAccount yoki DepositAccount ob'ekti yaratiladi va keyin hisoblar qatoriga qo'shiladi. Massivlar avtomatik ravishda kengaymagani uchun biz aslida bittaga ko'paytirilgan elementlar bilan yangi massiv yaratamiz va yangi massiv oxiriga yangi element qo'shamiz.Shu bilan birga, parametrlashtirish, ya'ni umumiy sinflarni yaratish cheklovga ega, chunki yaratilgan ob'ekt hali ham T turiga o'tkazilishi kerak:
newAccount = new DemandAccount(sum, 1) as T;
Bunday quyma xatolardan qochishimizga imkon beradi, masalan, agar biz Bank sinfini Hisob bilan emas, balki DepozitAccount turi bilan yozsak, konvertatsiya newAccount = new DemandAccount(sum, 1) as Tbizga null bo'ladi. Keyinchalik, qabul qilingan qiymatni null uchun tekshirishimiz mumkin:
if (newAccount == null)
Shuningdek, ishlov beruvchilar Account ob'ekti yaratilgandan keyin o'rnatiladigan Account sinfining barcha hodisalari uchun Open usuliga o'tkaziladi.Oxirida, usul yangi bo'yicha chaqiriladi Hisob qaydnomasi ob'ekti OnOpened(), Hisob qaydnomasi.Ochilgan hodisani yaratadi, buning yordamida siz tashqi tomondan hodisa haqida xabar olishingiz mumkin.Hisobni massivda id bo'yicha qidirish uchun usul aniqlanadi FindAccount(). Uning haddan tashqari yuklangan versiyasi, shuningdek, indeks chiqish parametri orqali topilgan elementning indeksini olish imkonini beradi:
public T FindAccount(int id, out int index)
Qo'yish, yechib olish va yopish usullari pul FindAccount()qo'shish yoki yechib olish, shuningdek, yopish uchun hisobni olish usulidan foydalanadi. Hisobni yopishda bitta Close()elementsiz usulda yangi massiv yaratiladi - o'chiriladigan hisob. Shunday qilib, hisob o'chiriladi.Usulda CalculatePercentage()biz hisoblar qatorining barcha elementlarini ko'rib chiqamiz, har bir hisob uchun kunlar hisoblagichini oshiramiz va foizlarni hisoblaymiz.Umuman olganda, Bank klassi o'ram bo'lib, u orqali biz asosiy loyihadagi Hisob ob'ektlari bilan o'zaro aloqada bo'lamiz.Umuman olganda, BankLibrary loyihasi quyidagicha ko'rinishi kerak:Va endi loyihani quraylik. Buning uchun Solution Explorer oynasida loyiha nomini sichqonchaning o‘ng tugmasi bilan bosing va paydo bo‘lgan kontekst menyusidan Build ni tanlang . Shundan so'ng, bin/Debug papkasida loyihada dll kengaytmali sinf kutubxonasi fayli yaratiladi .
3.Bosh loyihani yaratish.
Birinchidan, oldingi mavzuda tuzilgan sinf kutubxonasini bog'laymiz. Buni amalga oshirish uchun BankApplication-ning asosiy loyihasida " Dependences " bandini o'ng tugmasini bosing va paydo bo'lgan menyuda " Ma'lumotnoma qo'shish... " bandini tanlang :
Endi asosiy loyihadagi Program.cs faylini quyidagicha o'zgartiramiz:
using System;
using BankLibrary;
namespace BankApplication
{
class Program
{
static void Main(string[] args)
{
Bank bank = new Bank("yunit bank");
bool alive = true;
while (alive)
{
ConsoleColor color = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.DarkGreen; //
Console.WriteLine("1. Hisobni ochish \t 2 \t 3. Hisob yaratish");
Console.WriteLine("4hisobni yopish \t 5. kun\t 6. Dasturdan chiqish");
Console.WriteLine("nomerni kiriting:");
Console.ForegroundColor = color;
try
{
int command = Convert.ToInt32(Console.ReadLine());
switch (command)
{
case 1:
OpenAccount(bank);
break;
case 2:
Withdraw(bank);
break;
case 3:
Put(bank);
break;
case 4:
CloseAccount(bank);
break;
case 5:
break;
case 6:
alive = false;
continue;
}
bank.CalculatePercentage();
}
catch (Exception ex)
{
color = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(ex.Message);
Console.ForegroundColor = color;
}
}
}
private static void OpenAccount(Bank bank)
{
Console.WriteLine("yaratilgan hisobni narxini ko’rsating:");
decimal sum = Convert.ToDecimal(Console.ReadLine());
Console.WriteLine("narx turini kiriting: 1. So’rovdan boshlab 2. depozit");
AccountType accountType;
int type = Convert.ToInt32(Console.ReadLine());
if (type == 2)
accountType = AccountType.Deposit;
else
accountType = AccountType.Ordinary;
bank.Open(accountType,
sum,
AddSumHandler, // hisobga pul mablag’larini qo’shish uchun ishlov berish
WithdrawSumHandler, //yig’ish ishlov berish
(o, e) => Console.WriteLine(e.Message), ishlov beruvchining lambada ko’rinishidagi foiz
CloseAccountHandler, // hisobni yopish uchun ishlov berish
OpenAccountHandler); // hisobni ochish uchun ishlov berish
}
private static void Withdraw(Bank bank)
{
Console.WriteLine("hisobdan yechib olinadigan summani kiriting:");
decimal sum = Convert.ToDecimal(Console.ReadLine());
Console.WriteLine("id ni kiriting:");
int id = Convert.ToInt32(Console.ReadLine());
bank.Withdraw(sum, id);
}
private static void Put(Bank bank)
{
Console.WriteLine("hisobga kiritiladigan summani kiriting:");
decimal sum = Convert.ToDecimal(Console.ReadLine());
Console.WriteLine("id summani kiriting:");
int id = Convert.ToInt32(Console.ReadLine());
bank.Put(sum, id);
}
private static void CloseAccount(Bank bank)
{
Console.WriteLine("yopiladigan hisob indifikatorini kiriting:");
int id = Convert.ToInt32(Console.ReadLine());
bank.Close(id);
}
private static void OpenAccountHandler(object sender, AccountEventArgs e)
{
Console.WriteLine(e.Message);
}
private static void AddSumHandler(object sender, AccountEventArgs e)
{
Console.WriteLine(e.Message);
}
private static void WithdrawSumHandler(object sender, AccountEventArgs e)
{
Console.WriteLine(e.Message);
if (e.Sum > 0)
Console.WriteLine("pullarni jo’nating");
}
private static void CloseAccountHandler(object sender, AccountEventArgs e)
{
Console.WriteLine(e.Message);
}
}
}
Kutubxona faylning boshida joylashgan:
using BankLibrary;
Main usulida Hisob klassi bo yicha terilgan Bank ob ekti yaratiladi va u orqali Hisob ob yektlari bilan o zaro aloqada bo ladik.Loop whilefoydalanuvchi tanlashi kerak bo'lgan buyruqlar ro'yxatini ko'rsatadi. Qurilishda ulardan birini tanlagandan so'ng switch, tegishli buyruq bajariladi. Har bir buyruq foydalanuvchidan ma'lumot olish, uni Convert klassi yordamida aylantirish va Bank ob'ektidagi usullarga argumentlarni o'tkazishni ifodalaydi.while siklining har bir iteratsiyasi bir kunga to'g'ri keladi,shuning uchun tsikl oxirida usul chaqiriladi bank.CalculatePercentage(), bu Hisob ob'ektlaridagi kunlar hisoblagichini oshiradi va foizlarni hisoblaydi.Natijada bank ishini va foydalanuvchi o'zaro ta'sirini taqlid qiluvchi quyidagi dastur paydo bo'ladi.
Do'stlaringiz bilan baham: |