public
procedure show; // uslub
end;
Ob’yekt (professor) ma’lumotlari uchun xotira ajratish, unga uslub- konstruktorni (Create) ob’yekt tipiga (TPerson) qo’llash natijasining qiymatini o’zlashtirish yo’li bilan amalga oshiriladi. Masalan,
professor := TPerson.Create;
buyrug’i bajarilgandan so’ng, professor ob’yektining ma’lumotlari uchun kerakli xotira ajratiladi.
Xotiradan joy ajratish bilan birga konstruktor qoidaga asosan ob’yekt maydonlariga boshlang’ich qiymatni yuklaydi. Quyida Tperson ob’yekti uchun konstruktorni qo’llashga misol keltirilgan:
constructor TPerson.Create;
begin
fname := '';
faddress := '';
end;
Konstruktorni qo’llash bir oz g’ayrioddiydir. Birinchidan, konstruktor tanasida dinamik xotira ajtatishni ta’minlovchi New buyrug’i yo’q. Xotira ajratish bo’yicha barcha zaruriy ishlarni konstruktorning o‘zi bajaradi. Ikkinchidan, dasturda konstruktorga murojaat funksiya uslibida bo’lsa ham konstruktor natija qaytarmaydi.
Ob’yekt maydonariga murojaat etish uchun ob’yekt va maydon nomlarini bir- biridan nuqta bilan ajratilgan holatda ko’rsatish kerak. Ob’yekt oz’i ko’rsatkich bo’lgani bilan maydonlarga murojaat etish vaqtida “^” belgisidan foydalanilmaydi. Masalan, professor ob’yektining fname maydoniga murojaat etish uchun professor^.fname o’rniga professor.fname yozish kerak.
Agar dasturda qandaydir ob’yekt foydalanilmayotgan bo’lsa, u holda ushbu ob’yektning maydonlari egallab turgan joyni bo’shatish mumkin. Bu ishni amalga oshirish uchun Free destruktor uslubidan foydalaniladi. Masalan, professor ob’yektining maydonlari egallab turgan xotirani bo’shatish uchun:
professor.Free; buyrug’ini yozish kifoya.
Uslub
Sinf uslublari (sinf ichida e’lon qilingan funksiya va protseduralar) sinf ob’yektlari ustida amallar bajaradi. Uslub bajarilishi uchun ob’yekt va uslub nomlarini bir-biridan nuqta bilan ajratib ko’rsatish kerak. Masalan,
professor. Show;
buyrug’i show uslubini professor ob’yektiga qo’llanishini chaqiradi.
Sinf uslublari dasturda xuddi oddiy protsedura va funksiya kabi aniqlanadi, ammo uslub hisoblangan protsedura va funksiyalar ikki qismdan iborat bo’ladi: uslub tegishli bo’lgan sinf nomidan va uslub nomidan. Sinf nomi uslub nomidan nuqta bilan ajratiladi.
Quyida Tperson sinfining show uslubini aniqlashga misol keltirilgan.
procedure TPerson.Show;
begin
ShowMessage( 'Ismi:'+fname+#13+'Adresi:'+faddress );
end;
Eslatma
Uslub buyruqlarida ob’yekt maydonlariga murojaat etish uchun ob’yekt nomi ko’rsatilmaydi.
Ob’yekt xususiyati va inkapsulyatsiya
Inkapsulyatsiya - bu yashirin maydоnlarni tushunish va ularga sinf uslubi
vоsitasi yordamida ruhsat (dоstup) berishni ta’minlashdir.
Delphi tilida ob’yekt maydonlariga murojaat etishni cheklash ob’yekt xususiyatlari yordamida amalga oshiriladi. Ob’yekt xususiyatlari xususiyat qiymatini saqlovchi maydonlar va xususiyat maydonlariga murojaat etishni ta’minlovchi ikkita uslub bilan xarakterlanadi. Xususiyat qiymatlarini o’rnatish uslubi xususiyatni yozish (write) uslubi deyiladi, xususiyat qiymatlarini olish uslubi esa xususiyatni o’qish (read) uslubi deyiladi.
Sinfning berilishida xususiyat nomidan oldin property (xususiyat) so’zi yoziladi. Xususiyat nomidan keyin uning tipi, so’ngra esa xususiyat qiymatiga murojaat etishni ta’minlovchi uslub nomi ko’rsatiladi. Read so’zidan keyin xususiyatni o’qishni ta’minlovchi uslub nomi, write so’zidan keyin esa xususiyatga yozishni ta’minlovchi uslub nomi ko’rsatiladi.
Quyida ikkita xususiyatdan (Name va Address) iborat bo’lgan Tperson sinfining berilishiga misol keltirilgan:
type
TName = string[15]; TAddress = string[35]; TPerson = class // sinf private
FName: TName; // Name xususiyatining qiymati FAddress: TAddress; // Address xususiyatining qiymati Constructor Create(Name:Tname);
Procedure Show;
Function GetName: TName;
Function GetAddress: TAddress;
Procedure SetAddress(NewAddress:TAddress);
public
Property Name: Tname // Name xususiyati
read GetName; // faqat o’qish uchun
Property Address: TAddress // Address xususiyati
read GetAddress // o’qish va write SetAddress; // yozish uchun end;
Dasturda xususiyat qiymatini o’rnatish uchun ob’yekt xususiyat qiymatini o’rnatish uslubini qo’llovchi buyruqlarni yozilmaydi, balki xususiyat qiymatini oddiy o’zlashtirish buyrug’ini yozish kifoya. Masalan, student ob’yektining Address xususiyatiga qiymat berish uchun quyidagi buyruqni yozish yetarli:
student.Address := 'Namangan sh, Do`stlik ko`cha, 11-uy';
Kompilyator yuqoridagi xususiyat qiymatini o’zlashtirish buyrug’ini uslubni chaqirish buyrug’iga o’zgartiradi:
student.SetAddress('Namangan sh, Do`stlik ko`cha, 11-uy');
Dasturda xususiyatni tashqi qo’llash ob’yekt maydonlaridan foydalanishdan hech qanday farq qilmaydi. Biroq, xususiyat va ob’yekt maydoni o’rtasida jiddiy farq mavjud: xususiyat qiymatlarini yuklash va o’qish vaqtida bir qator ishlarni bajaruvchi protsedura avtomatik tarzda chaqiriadi.
Dasturda xususiyat uslublariga bir qator qo’shimcha vazifalarni yuklash mumkin. Masalan, uslub yordamida yuklangan xususiyat qiymatining to’g’riligini tekshirish, xususiyat bilan mantiqiy bog’langan boshqa maydonlarga qiymat o’rnatish, yordamchi protseduralarni chaqilish mumkin.
Ob’yekt ma’lumotlarini xususiyat sifatida rasmiylashtirish ob’yekt xususiyatini saqlovchi maydonlarga murojaat etishni cheklash imkonini yaratadi: masalan, faqat o’qish uchun ruhsat berish mumkin. Dastur buyruqlari hususiyat qiymatlarini o’zgartira olmasligi uchun hususiyat berilishida faqat o’qish uslubining nominigina berish kerak. Faqat o’qish uchun mo’ljallangan hususiyat qiymatini o’zgartirishga urinish kompilyatsiya vaqtida xatolik sodir bo’ladi. Yuqorida keltirilgan Tperson sinfining Name hususiyati faqat o’qish uchun, Address hususiyati esa o’qish va yozish uchun mo’ljallangan.
Yozishdan himoyalangan hususiyat qiymatini ob’yektni yaratish vaqtida o’rnatish mumkin. Quyida TPerson sinfining ob’yektini yaratish va uning hususiyatlariga murojaat etishni ta’minlovchi TPerson sinfining uslublari keltirilgan.
// TPerson ob’yektining kostruktori Constructor TPerson.Create(Name:TName); begin
FName:=Name;
end;
// Name hususiyatining qiymatini olish uslubi
Function TPerson.GetName;
begin Result:=FName; end;
// Address hususiyatining qiymatini olish uslubi
function TPerson.GetAddress;
begin Result:=FAddress; end;
// Address hususiyatining qiymatini o’zgartirish Procedure TPerson.SetAddress(NewAddress:TAddress); begin
if FAddress =' '
then FAddress := NewAddress;
end;
Keltirilgan TPerson ob’yektining kostruktori ob’yektni yaratadi va Name
hususiyatining qiymatini aniqlovchi FName maydonining qiymatini o’rnatadi.
TPerson sinfning ob’yektini yaratuvchi va uning qiymatlarini o’rnatishni ta’minlovchi dastur buyruqlari quyidagicha bo’lishi mumkin:
student := TPerson.Create('Qodirov');
student.Address := 'Namangan sh, Do`stlik ko`cha, 11-uy';
Vorislik (me’ros olish)
Ob’yektga mo’ljallangan dasturlashning mohiyati mavjud sinfga maydon, hususiyat va uslub qo’shish yo’li bilan yangi sinf yaratish imkonini beradi. Yangi sinflarni yaratishning bunday mexanizmi tug’ilish deb ataladi. Bunda yangi tug’ilgan sinf (avlod) o’zining ajdod sinfidan hususiyat va uslublarni me’ros qilib oladi.
Avlod sinfni e’lon qilishda ajdod sinf ko’rsatiladi. Masalan, TEmployee (Xodim) sinfi yuqorida ko’rib o’tilgan TPerson sinfiga FDepartment (Bo’lim) maydonini qo’shish yo’li bilan tug’ilgan bo’lishi mumkin. U holda TEmployee sinfini e’lon qilish quyidagicha bo’lishi mumkin:
TEmployee = class(TPerson)
FDepartment: integer; // bo’lim raqami constructor Create(Name:TName; Dep:integer); end;
Qavs ichidagi TPerson sinfining nomi TEmployee sinfi TPerson sinfidan hosil qilib olinganini bildiradi. O’z navbatida TPerson sinfi TEmployee sinfiga manbaa hisoblanadi.
TEmployee sinfi ajdod sinfga va o’zining maydonlariga boshlang’ich qiymatlarni yuklash uchun oz’ining shaxsiy kostruktoriga ega bo’lishi kerak. Quyida TEmployee sinfining konstruktorini qo’llashga misol keltirilgan:
constructor TEmpioyee.Create(Name:Tname; Dep:integer);
begin
inherited Create(Name);
FDepartment:=Dep;
end;
Keltirilgan misolda inherited direktivasi yordamida ajdod sinfning kostruktori chaqirilgan. So’ngra avlod sinfning maydoniga boshlang’ich qiymat yuklanyapti.
Avlod sinfning ob’yektini yaratib olgandan keyin dasturda ajdod sinfning maydon va uslublaridan foydalanish mumkin. Quyida ushbu imkoniyatni namoyish etuvchi dastur qismi keltirilgan:
engineer := TEmployee.Create('Qodirov',413); engineer.address := 'Namangan sh, Do`stlik ko`cha, 11-uy';
Bu yerda birinchi buyruq TEmployee tipidagi ob’yekt yaratadi, ikkinchisi esa ajdod sinfga tegishli bo’lgan Address hususiyatining qiymatini o’rnatadi.
Protected va Private direktivalari
Sinf berilishi sinf elementlarini (maydon, uslub va hususiyatlarni) e’lon qilishdan tashqari qoidaga asosan dasturda sinf elementlarining ko’rinish darajasini o’rnatuvchi Protected (himoyalangan) va Private (berkitilgan) direktivalariga ega bo’ladi.
Protected bo’limida e’lon qilingan sinf elementlariga murojaat etish faqat uning avlodlarigagina ruhsat etiladi. Ammo ushbu bo’limdagi sinf elementlarining ko’rinish sohasi sinf berilishi joylashgan modulda cheklanmaydi. Odatda protected bo’limida sinf uslublari joylashadi.
Private bo’limida e’lon qilingan sinf elementlari faqat sinf joylashgan modul ichidagina ko’rinadi. Bu elementlarga moduldan tashqarida, xatto avlod sinfda ham ruhsat berilmaydi. Odatda Private bo’limida sinf maydonlari joylashadi, bu maydonlarga murojaat etishni ta’minovchi uslublar esa protected bo’limida joylashadi.
Quyida ruhsat etishni boshqaruvchi direktivalar qo’shilgan TPerson sinfining berilishi keltirilgan
TPerson = class private
FName: TName; // Name hususiyatining qiymati FAddress: TAddress; // Address hususiyatining qiymati protected
Constructor Create(Name:TName); Function GetName: TName; Function GetAddress: TAddress;
Procedure SetAddress(NewAddress:TAddress);
Property Name: TName
read GetName;
Property Address: TAddress
read GetAddress write SetAddress; end;
Do'stlaringiz bilan baham: |