Private, protected va public kalit so’zlari bilan sinf e’lon qilish. Sinf ixtiyoriy sondagi
berilganlar va metodlarni о„z ichiga olishi mumkin. OYP mohiyati barcha berilganlarni sinfda
“yashiringan” (inkapsulyatsiya qilingan) holda bо„lishini taqoza etadi. Buning sababi –
maydonlar qiymatini tо„g„ridan-tо„g„ri о„zgartirish xatoliklarni yuzaga keltirishi mumkin.
Masalan, sana uchun notо„g„ri sana - 30 fevral kiritilishi mumkin. Agar maydon qiymatlari sinf
metodlar ishlatilganda qiymatlar tekshirilishi mumkin, ya‟ni ma‟lum bir ma‟noda qiymatlar
kiritilishida nazorat о„rnatiladi. Inkapsulyatsiyaning yana bir afzalligi shundaki, sinfning tashqi
tavsifiga ta‟sir qilmagan holda uning ichki tuzilishiga о„zgartirishlar kiritishimiz mumkin.
Boshqacha aytganda, nisbatan oson yо„l bilan sinfning navbatdagi modifikatsiyasini yaratiladi.
Inkapsulyatsiya g„oyasining quyidagi о„xshatish orqali kо„rsatish mumkin: sinf – bu
kichkina kо„rinadigan qismga ega bо„lgan «qora quti» deb qaraladi. Kо„rinadigan qism sinf
interfeysi deyiladi va programmaning boshqa qismlaridan sinf maydon va metodlariga murojaat
qilish va undan foydalanish imkonini beradi.
Object Pascal tilida sinfga tashkil qiluvchilariga murojaatning uch xil imkoniyati mavjud:
- private kalit sо„zi bilan sinf e‟lon qilingan moduldan tashqarida murojaat qilish
mumkin bо„lmagan maydon va metodlar aniqlanadi;
- public kalit sо„zi orqali programmaning ixtiyoriy qismdan murojaat qilish mumkin
bо„lgan maydon va metodlar tavsiflanadi;
- protected kalit sо„zi bilan qisman murojaat qilishga ruxsat bо„lgan maydon va
metodlar aniqlanadi. Ularga faqat shu sinf va undan voris sinflar metodlari murojaat
qilishi mumkin.
OYP ma‟qul kо„rinishi shundaki sinfning barcha maydonlari private kategoriyasiga
tegishli, metodlar esa public bо„limida aniqlangan bо„lishini talab qiladi. Lekin bu qoidalar
qat‟iy emas. Metodlar ham private, protected xususiyati bilan aniqlangan bо„lishi mumkin, agar
ular faqat shu sinf ichida ishlatiladigan bо„lsa.
Misol sifatida TSana sinfini aniqlaylik:
Type
TSana = Class
Private
Kun, Oy,Yil : Integer;
Public
Procedure Joriy_Sana(k,o,y :Integer); // Joriy sanani kiritish
Function Kabisa: Boolean; // Yilning kabisa yili ekanligi aniqlash
Function Sana_Satr : String; // Sanani satr kо„rinishiga о„tkazish
Procedure Ertangi_Sana;
// Sanani ertagi sanaga о„tkazish
End;
…
implementation
Procedure TSana.Joriy_Sana(k,o,y:Integer);
Begin
Kun :=k; Oy :=o; Yil :=y
End;
Function TSana.Kabisa: Boolean;
Begin
Result := (Yil mod 4=0) and (Yil mod 100<>0) Or (Yil mod 100=0) and ((Yil mod
400=0);
End;
10
Function TSana.Sana_Satr : String;
Begin
Result := IntToStr(Kun)+‟.‟ +IntToStr(Oy)+‟.‟+IntToStr(Yil);
End;
Procedure TSana.Ertangi_Sana;
Begin
...
end;
Sinf e‟lonidagi о„zgaruvchilar private bо„limida aniqlangan, shu sababli ularga murojaat
qilishning faqat sinf metodlari orqali amalga oshirish mumkin.
Sana bilan bog„liq sinfni aniqlashda imkon qadar Delphi standart vositalaridan
foydalangan ma‟qul. Xususan, TSana sinfida sana uchun TDateTime turini ishlatish maqsadga
muvofiq.
Type
TSana = Class
Private
Fsana: TDateTime;
Public
Procedure Joriy_Sana(k,o,y :Integer);
Function Kabisa: Boolean;
Function Sana_Satr : String;
Procedure Ertangi_Sana;
End;
Procedure TSana.Joriy_Sana(k,o,y: Integer);
Begin
FSana := EnCodeDate(y,o,k);
End;
E‟tibor berilgan bо„lsa, о„zgarishlar faqat sinfning ichida amalga oshirildi, undan
foydalanuvchi uchun tashqaridan hech bir о„zgarish rо„y bermadi.
Inkapsulyatsiyaning bosh g„oyasi – programma tomonidan ishlatiladigan globoal
о„zgaruvchilarni kamaytirishdir. Global о„zgaruvchiga programmaning ixtiyoriy joyidan
murojaat qilish mumkin. Shu sababli global о„zgaruvchida rо„y bergan о„zgarish butun
programmaga ta‟sir qiladi.
Faraz qilaylik, programma bir nechta formadan tashkil topgan bо„lsin. Birorta
о„zgaruvchiga barcha formalardan murojaat qilish mumkin bо„lishi uchun uni birorta modulning
interface bо„limida quyidagicha e‟lon qilish zarur:
var
Form1 : TForm1;
VMurojaat : Integer;
E‟lonning bu kо„rinishida VMurojaat о„zgaruvchisi formaning konkret nusxasi bilan
emas, balki butun bir programma bilan bog„liq bо„ladi. Bir turdagi ikkita forma aniqlansa (var
Form1, Form12 : TForm1), ular bu о„zgaruvchilarni birgalikda ishlatishi mumkin. Agar har bir
forma о„zgaruvchining о„z nusxasiga ega bо„lishi zarur bо„lsa, uning e‟lonini sinf ichiga kiritish
zarur bо„ladi:
Type
TForm1 = Class(TForm)
Public
VMurojaat : Integer;
End;
Bu e‟lon ham ma‟lum bir muammoni keltirib chiqaridi – о„zgaruvchi public deb e‟lon
qilinganligi uchun bu о„zgaruvchini ishlatadigan kodni о„zgartirmasdan turib sinfning ichki
tuzilishiga о„zgartirish kiritib bо„lmaydi. Masalan, VMurojaat о„zgaruvchisga formaga nechta
11
marta murojaat qilingaligini aniqlash uchun murojaat qilish zarur bо„ladigan bо„lsa uni private
bо„limida e‟lon qilib, uning qiymatini о„qiydigan metod yaratish kerak bо„ladi:
Type
TForm1 = Class (TForm)
Public
Function Murojaat_Soni: Integer;
Private
VMurojaat : Integer;
End;
Function TForm1.Murojaat_Soni : Integer;
Begin
Result := VMurojaat;
End;
Do'stlaringiz bilan baham: |