Algoritmni loyihalash va tahlil qilishga kirish


Download 110.63 Kb.
bet9/12
Sana16.01.2023
Hajmi110.63 Kb.
#1095305
1   ...   4   5   6   7   8   9   10   11   12
Bog'liq
Algoritmni loyihalash va tahlil qilishga kirish

9. Sinflar va ob'ektlar
Reja:
1. OOP tushunchasi
2. Sinflar va ob'ektlar
OOP g'oyasi C ++ da sinflar deb ataladigan ob'ektlar darajasida vazifani tavsiflashdir. Masalan, sinf ob'ektni chiziq, ellips, to'rtburchak sifatida tasvirlashi mumkin. Ammo har qanday ob'ektlarning xususiyatlarini har tomonlama tasvirlab bera oladigan tuzilmalardan farqli o'laroq, uchta toifaga bo'linadigan sinflar o'rtasida o'zaro ta'sir o'tkazish mumkin: merosxo'rlik, polimorfizm va inkapsulyatsiya.
Meros - bu ilgari yaratilgan sinf asosida yangi sinf yaratish mexanizmi. Ko'pgina o'xshash bo'lmagan ob'ektlar umumiy xususiyatlar yoki funktsiyalarga ega bo'lganda merosxo'rlik mantiqan to'g'ri keladi. Shunday qilib, grafik ibtidoiylar uchun chiziq turi, rangi va qalinligi dasturlash tili darajasida bir xil tarzda tavsiflanadi va mantiqan bir xil toifaga - grafik ibtidoiy xususiyatlariga tegishli. Shuning uchun meros mexanizmidan foydalangan holda chiziq, ellips va to'rtburchaklar haqida batafsilroq ma'lumot berish uchun ushbu elementlarni alohida sinf - bazaga ajratish va uning asosida yangi sinflar - bolani ajratish maqsadga muvofiqdir.
Polimorfizm - bu bolalar uchun asosiy sinf funktsiyalarini chaqirish va qayta aniqlash jarayoni. Polimorfizm bolalar sinflarining umumiy funktsiyalarini bazaga o'tkazishga imkon beradi, so'ngra ular unda aniqlangan deb hisoblab, boladan chaqiriladi. Biroq, bu bolada asosiy sinf funktsiyalarini bekor qilish imkoniyatini istisno etmaydi.
Enkapsulyatsiya - bu sinfni ifodalashning qora qutisi. Demak, sinfning oxirgi foydalanuvchisi (dasturchi) sinf bilan ishlash uchun faqat ma'lum funktsiyalar va o'zgaruvchilar to'plamiga kirish huquqiga ega. Kirish cheklovi ko'pincha o'zgaruvchilarga to'g'ridan-to'g'ri kirish taqiqlangan bo'lsa, funktsiyalar orqali sinf o'zgaruvchilariga qiymatlarni yozish uchun ishlatiladi.
C ++ dagi sinf class kalit so'zidan foydalanib, uning nomi va ta'rifi jingalak qavs ichida ko'rsatiladi {}. Sinf ta'rifidan keyin nuqta-vergul qo'yiladi. Quyida grafik ibtidoiy koordinatalarini saqlash uchun sinf tavsifining namunasi keltirilgan:
sinf CPos
{
int sp_x, sp_y; // koordinatani boshlash
int ep_x, ep_y; // so'nggi koordinat
};
Har bir sinfda konstruktor va destruktor deb nomlangan maxsus funktsiyalar mavjud. Sinf konstruktori kompyuter xotirasida ob'ekt yaratilganda har doim chaqiriladi va odatda sinf ma'lumotlarini initsializatsiya qilish uchun ishlatiladi. Konstruktor sinf nomi bilan bir xil nomga ega. Destruktor sinf xotiradan chiqarilganda chaqiriladi va qoida tariqasida ilgari ajratilgan xotirani ushbu sinfning har qanday ma'lumotlari uchun bo'shatish uchun ishlatiladi. Yo'q qiluvchining nomi sinf nomi bilan bir xil, ammo uning oldida '~' belgisi qo'yilgan. CPos klassi uchun konstruktor va destruktorni amalga oshirishning bir misolini ko'rib chiqamiz.
sinf CPos
{
jamoat:
CPos () {printf ("Konstruktor chaqiruvi. \ N");}
~ CPos () {printf ("Yo'q qiluvchini chaqiring. \ N");}
int sp_x, sp_y; // koordinatani boshlash
int ep_x, ep_y; // so'nggi koordinat
};
Bu erda umumiy kalit so'z funktsiyalar va sinf o'zgaruvchilariga umumiy kirishni ta'minlash uchun ishlatiladi.
Kompyuter xotirasida sinfning yangi nusxasini yaratish uchun yangi C ++ operatori, o'chirish uchun esa o'chirish operatori ishlatiladi. CPos sinfining nusxasini yaratish va uni olib tashlash uchun ushbu operatorlardan foydalanish quyidagicha ko'rinadi:
CPos * pos_ptr = yangi CPos (); // ob'ekt yaratish
pos_ptr-ni o'chirish; // ob'ektni o'chirish
Ushbu ikki satr kodni bajarish natijasida ekranda quyidagi xabarlar paydo bo'ladi:
Konstruktor qo'ng'irog'i.
Yo'q qiluvchini chaqirish.
Sinfning bir misoli quyida ko'rsatilgandek ko'rsatgichlardan foydalanmasdan oddiy o'zgaruvchilar kabi o'rnatilishi mumkin
CPos pos;
Bu holda pos o'zgaruvchisi sinf vakili deb ataladi, u yaratilganda konstruktorni va xotiradan chiqarilganda destruktorni ham chaqiradi.
Shuni ta'kidlash kerakki, sinfning yangi nusxasini yaratishda ularning qiymatlarini konstruktor orqali o'tkazib, turli xil o'zgaruvchilarni ishga tushirishingiz mumkin. Bunday holda, konstruktor kerakli argumentlar to'plami bilan e'lon qilinishi kerak, masalan:
sinf CPos

public: 
CPos(int x1, int y1, int x2,int y2) 

sp_x = x1; sp_y = y1; 
ep_x = x2; ep_y = y2; 

~CPos() {} 
int sp_x, sp_y; 
int ep_x, ep_y; 
};
va sinfning nusxasini yaratish jarayoni quyidagi shaklga ega:
CPos * pos_ptr = yangi CPos (10,10,20,20);
yoki
CPos pos (10,10,20,20);
Konstruktorni tavsiflash va chaqirishning bu usuli yangi ob'ekt yaratishda ma'lumotlarni ishga tushirish uchun qo'shimcha qulayliklar yaratadi. Bunday holda, konstruktor, har qanday funktsiya singari, haddan tashqari yuklanishi mumkin. Bu shuni anglatadiki, bir sinfda bir nechta konstruktor turlarini (kirish parametrlarining har xil to'plamlari bilan) belgilashingiz mumkin. Masalan, agar grafik ibtidoiy sinfning misoli yaratilsa, lekin u uchun boshlang'ich va yakuniy koordinatalari noma'lum bo'lsa, u holda CPos () konstruktorini argumentlarsiz chaqirish maqsadga muvofiqdir va agar koordinatalar ma'lum bo'lsa, ularni konstruktorni argumentlar bilan chaqirish orqali boshlash kerak. Bir sinfda bir nechta konstruktor turlarini tavsiflash uchun unda ularning ta'riflarini berish kifoya:
class CPos 

public: 
CPos() {} 
CPos(int x1, int y1, int x2,int y2) 

sp_x=x1; sp_y=y1; 
ep_x=x2; ep_y=y2; 
}
~CPos() {} 

int sp_x, sp_y; 


int ep_x, ep_y; 
};
Sinflarda o'zgaruvchilar, konstruktorlar va destruktorlardan tashqari siz tavsiflarni va oddiy funktsiyalarni belgilashingiz mumkin, bu holda bu usullar deyiladi. Masalan, ibtidoiy koordinatalarning qiymatlarini belgilash uchun CPos sinfida sp_x, sp_y, ep_x va ep_y o'zgaruvchilarga qiymatlarni kiritish funktsiyasini qo'shish maqsadga muvofiqdir. Bu, birinchidan, dasturchi uchun ushbu o'zgaruvchilarning nomlarini yodlashga emas, balki faqat bitta funktsiya bilan ishlashga imkon beradi, ikkinchidan, funktsiyaning o'zida siz ularni o'zgaruvchiga berishdan oldin o'tgan koordinata qiymatlarining haqiqati uchun kerakli tekshiruvlarni amalga oshirishingiz mumkin. Bunday funktsiyani sinfda quyidagicha ta'riflash mumkin:
class CPos 

public: 
CPos() {} 
~CPos() {} 
void SetParam(int x1, int y1, int x2, int y2) 

if(x1 >=0 && x1 <=MAX_SIZE) sp_x=x1; 
if(y1 >=0 && y1 <=MAX_SIZE) sp_y=y1; 
if(x2 >=0 && x2 <=MAX_SIZE) ep_x=x2; 
if(y2 >=0 && y2 <=MAX_SIZE) ep_y=y2; 

int sp_x, sp_y; 
int ep_x, ep_y; 
};
Yuqoridagi misolda SetParam () funktsiyasi amalga oshirildi, bu o'zgaruvchilarga qiymatlarni berishdan oldin ularning haqiqatini tekshiradi. Bu erda ba'zi bir noqulayliklar shundaki, bu funktsiya CPos sinfida to'liq tavsiflangan va bitta sinfdagi ko'p sonli funktsiyalarning tavsifi dastur matnini o'qishni qiyinlashtiradi. Shuning uchun, odatda sinflarda faqat funktsiya prototiplari yoziladi va ularning bajarilishi sinf tavsifidan keyin alohida-alohida beriladi. CPP sinfidan tashqarida SetParam () funktsiyasining bajarilishini tavsiflash uchun funktsiya nomidan oldin quyida ko'rsatilgandek global rezolyutsiya operatori '::' bo'lgan sinf nomi keltirilgan:
void CPos::SetParam(int x1, int y1, int x2, int y2) 

if(x1 >=0 && x1 <=MAX_SIZE) sp_x= x1; 
if(y1 >=0 && y1 <=MAX_SIZE) sp_y= y1; 
if(x2 >=0 && x2 <=MAX_SIZE) ep_x= x2; 
if(y2 >=0 && y2 <=MAX_SIZE) ep_y= y2; 
}
va undan oldin quyidagi sinf ta'rifi bo'lishi kerak:
class CPos 

public: 
CPos() {} 
~CPos() {} 
void SetParam(int x1, int y1, int x2, int y2); 
int sp_x, sp_y; 
int ep_x, ep_y; 
};
Xuddi shunday, siz konstruktorlar va destruktorlarni sinfdan tashqarida tasvirlashingiz mumkin. Ushbu funktsiyalar chaqiruvchi dasturga hech narsa qaytarmasligini va turlariga ega emasligini hisobga olsak, ularning tashqi bajarilishi quyidagicha bo'ladi:
CPos :: CPos ()
{
// konstruktor bayonotlari
}
CPos :: ~ CPos ()
{
// destruktor operatorlari
}
SetParam () funktsiyasini '->' operatoridan foydalangan holda sinfga ko'rsatgich orqali yoki '.' Operatoridan foydalangan holda proksi orqali chaqirish mumkin.
CPos * pos_ptr = yangi CPos ();
CPos pos;
pos_ptr-> SetParam (10,10,20,20);
pos.SetParam (10,10,20,20);
Sinf o'zgaruvchilariga xuddi shu tarzda kirish mumkin:
pos_ptr-> sp_x = 10;
pos.sp_x = 20;
Bu erda sp_x, sp_y, ep_x va ep_y o'zgaruvchilarining qiymatlari to'g'ridan-to'g'ri ularga kirishda yoki SetParam () funktsiyasidan foydalangan holda o'rnatilishi mumkinligini ko'rishingiz mumkin. Natijada, ushbu funktsiyada amalga oshirilgan tekshirishni dasturchi e'tiborsiz qoldirishi mumkin. Bunday holat ko'pincha qabul qilinishi mumkin emas, masalan, tayyor kutubxona sinflari MFC, VCL, OWL va boshqalarni ishlatishda. Shu munosabat bilan o'zgaruvchilar va funktsiyalar uchun sinflar uchta kalit so'z bilan belgilanadigan turli xil kirish darajasini belgilash imkoniyatini beradi: jamoat, xususiy va himoyalangan. Ochiq kalit so'z sinf o'zgaruvchilari va funktsiyalariga umumiy kirishni anglatadi. Xususiy kirish darajasi sinf a'zolariga kirishning xususiy usulini bildiradi va sinf e'lon qilinganda sukut bo'yicha o'rnatiladi. Xususiy kirish darajasi o'zgaruvchilar va funktsiyalarga faqat sinf ichida kirishga imkon beradi va tashqi tomondan taqiqlaydi, masalan, vakillar yoki sinf ko'rsatgichlari orqali. Himoyalangan kirish rejimi, shuningdek shaxsiy, sinf a'zolariga vakillar va ko'rsatgichlar orqali kirishni taqiqlaydi, lekin meros paytida bolalar sinflaridan ularga kirish imkoniyatini beradi. Ushbu uchta kirish rejimini hisobga olgan holda, grafik ob'ektlarning koordinatalari bilan ishlash sinfini quyidagi shaklda yozish tavsiya etiladi:
class CPos 

public: 
CPos() {} 
~CPos() {} 

void SetParam(int x1, int y1, int x2, int y2); 



private: 
int sp_x, sp_y; 
int ep_x, ep_y; 
};
Bu erda xususiy bo'lim sinf foydalanuvchisiga faqat SetParam () funktsiyasi bilan sp_x, sp_y, ep_x va ep_y o'zgaruvchilariga kirishni cheklaydi. Shuni ham ta'kidlash kerakki, sinf deklaratsiyasining boshida ochiq bo'limning yo'qligi CPos sinfining barcha funktsiyalari xususiy bo'lishiga olib keladi. Natijada konstruktor va destruktorga kirish taqiqlanadi va yangi ob'ektni yaratish imkonsiz bo'lib qoladi. Shunga o'xshash rasm himoyalangan kirish rejimida sodir bo'ladi, lekin xususiy sinfdan farqli o'laroq, siz uni meros mexanizmida asosiy sinf sifatida ishlatishingiz mumkin. Ushbu xususiyat sinf misollarini yaratishni taqiqlash uchun foydalidir, agar u ob'ektlar ierarxiyasida faqat oraliq bo'g'in bo'lsa va qiymatni alohida ob'ekt sifatida ko'rsatmasa kerak.
Ob'ekt (dasturlash)
Dasturlashdagi ob'ekt - bu ma'lum bir holat va xulq-atvorga ega bo'lgan, xususiyatlarning (atributlarning) belgilangan qiymatlari va ular bo'yicha operatsiyalarga ega bo'lgan virtual makondagi mavjudot. Qoidaga ko'ra, ob'ektlarni ko'rib chiqishda, ob'ektlarning xatti-harakatlarini belgilaydigan (namuna) bir yoki bir nechta sinflarga tegishli ekanligi ajralib turadi. "Sinfning misoli" va "ob'ekt" atamalari bir-birining o'rnida ishlatiladi.
Ob'ekt sinf tushunchasi bilan bir qatorda ob'ektga yo'naltirilgan yondashuvda muhim tushuncha hisoblanadi. Ob'ektlar merosxo'rlik, kapsulalash va polimorfizm xususiyatlariga ega.
Dasturiy ta'minotdagi ob'ekt atamasi birinchi marta Simula tilida kiritilgan va haqiqatni modellashtirish uchun ishlatilgan.
Tegishli tushunchalar
Sinfning misoli - bu xotirada ma'lum bir ob'ektning tavsifi. Sinf sinfdagi tavsifga muvofiq qurilgan ob'ekt uchun mavjud bo'ladigan xususiyatlar va usullarni tavsiflaydi. Namunalar real dunyoda aniq shaxslarni namoyish qilish (modellashtirish) uchun ishlatiladi. Masalan, kir yuvish mashinalari sinfining namunasi sizning kir yuvish mashinangiz bo'lishi mumkin, u quyidagi xususiyatlarga ega: "Vyatka" ishlab chiqaruvchi kompaniya, "Vyatka-avtomatik mashina" rusumidagi nom, VYAT454647 mahsulotining seriya raqami, hajmi 20 litr. Sinf nomidan farqli o'laroq, misol nomi odatda kichik harf bilan boshlanadi.
Instantiation - bu sinfning nusxasini yaratish. "Yaratish" so'zidan farqli o'laroq, u ob'ektga emas, balki sinfga tegishli. Ya'ni, ular shunday deyishadi: (virtual muhitda) sinfning namunasini yarating yoki boshqacha qilib aytganda sinfni o'rnating. Umumiy shablonlar polimorfik instantatsiyadan foydalanadi.
Anonim ob'ekt - bu ma'lum bir sinfga tegishli bo'lgan, ammo ismga ega bo'lmagan ob'ekt.
Initsializatsiya - bu ob'ekt maydonlariga dastlabki qiymatlarni berish.
Ob'ektning yashash muddati - bu ob'ekt yaratilgan (qurilgan) paytdan boshlab uni yo'q qilish (yo'q qilish) gacha bo'lgan vaqt.
Amaliy yondashuv
Lua va JavaScript kabi prototipga yo'naltirilgan tillardan tashqari, "sinf" tushunchasi umuman qo'llanilmaydi, aksariyat ob'ektga yo'naltirilgan dasturlash tillarida (masalan, Java, C ++ yoki C #) ob'ektlar ba'zi oldindan belgilangan sinfning misollari hisoblanadi.
Bunday tillardagi ob'ektlar sinf konstruktori yordamida yaratiladi va yo'q qilinadi yoki sinf destruktori yordamida (masalan, C ++ da) yoki avtomatik ravishda axlat yig'uvchisi yordamida (masalan, Java va C # da) yoki ob'ektlar va xabarlarning ichki hisoblagichi yordamida ("dealloc "Maqsadda-C). (C # destruktorlarni qo'llab-quvvatlaydi, ammo ularni axlat yig'uvchi chaqiradi.) Ob'ekt o'zining barcha maydonlarining ma'lumotlari va o'z sinfining virtual metodik jadvali va RTTI-ga havola sifatida saqlanadi. Sinf ob'ektni qurish uchun funktsiyalar va xizmat ma'lumotlari to'plamini, shu jumladan ob'ektni saqlash uchun zarur bo'lgan xotirani belgilaydi.
Python-da barcha qiymatlar ob'ektlar, hatto sinflardir. Ushbu tilda siz sinflar misollari bo'ladigan sinf qurishingiz mumkin. Bunday sinflar metaclasses deb nomlanadi.
Namuna kodi
Java dasturlash tilida yangi ob'ektni yaratish va u bilan ishlashga misol:
// ArrayList sinfining ro'yxati nomini yarating
ArrayList ro'yxati = yangi ArrayList ();
// Ro'yxat ob'ektiga Integer sinfining nusxalarini qo'shing
list.add (yangi Integer (1));
list.add (yangi Integer (2));
list.add (yangi Integer (3));
ArrayList klassi dastur kodida allaqachon tasvirlangan deb taxmin qilinadi va uning tavsifida sinf konstruktorining ta'rifi va qo'shish usuli mavjud.


Download 110.63 Kb.

Do'stlaringiz bilan baham:
1   ...   4   5   6   7   8   9   10   11   12




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling