1-Amaliy mashg’ulot. Voris sinflarni yaratish va foydalanish. Ishning maqsadi


Download 46.81 Kb.
bet2/3
Sana18.10.2023
Hajmi46.81 Kb.
#1707672
1   2   3
Bog'liq
1-amaliy

8.10-listing
using System;
namespace DasturAvlodAjdod
{
internal class Avto // Avtomobil
{
private const int maxTezlik = 90; // Avtomobil tez-ligining maksimum qiymati
private int AvtoTezlik; // Maydon
public int Tezlik // Xossa (umumruxsatli bo'lishi kerak)
{
get { return AvtoTezlik; }
set
{
AvtoTezlik = value;
if (AvtoTezlik > maxTezlik) // Avtomobil tezligini nazorat qilish
AvtoTezlik = maxTezlik;
}
} // Tezlik
}//Sinf
internal class My_Avto : Avto
{
private const int maxNom = 20;
private string AvtoNom; // Maydon — avtomobil mar-kasi
public string Nom // Xossa (umumruxsatli bo'lishi kerak)
{
get { return AvtoNom; }
set
{
AvtoNom = value;
if (AvtoNom.Length > maxNom)
AvtoNom = "Xato: marka nomi 20 ta belgidan katta bo'lmasligi kerak";
}
}
}
internal class Program
{
public static void Main()
{
Console.WriteLine("Ushbu sinf vorisdir:");
Avto Avto_oby = new Avto { Tezlik = 85 }; 
// bazali sinfdagi obyektni initsializatsiyalash
Console.WriteLine("Ona sinfdagi tezlikni o'rnatish: {0}", Avto_oby.Tezlik);
My_Avto Avto1 = new My_Avto { Nom = "Volvo" };
//Obyektni initsializatsiyalash
Avto1.Tezlik = 88;
Console.WriteLine("Avtomobil markasi: " + "{0}\nQiz sinfdagi tezlik: {1}", Avto1.Nom, Avto1.Tezlik);
}
}
}





8.4-rasm. Ona va avlod sinfdan foydalanish

Birinchidan, shuni yodddan chiqarmasligimiz kerakki, xossa public atributiga ega bo’lishi, ya’ni umumruxsatli bo’lishi kerak. Agar public atributida ko’rsatilmasa, kompilyator sinfning bu a’zosini avtomatik ravishda private atributiga o’zlashtiradi. Lekin xossa avtomatik bo’lsa, u holda jimlik bo’yicha u public atributiga tegishli bo’ladi. Bizning holatda xossa avtomatik ravishda e’lon qilinmagan, mukamallashtirilgan sintaksis bilan an’anaviy usulda berilgan.


Ikkinchidan, sinfning hosilasida obyekt yaratilsa, uning barcha a’zolari qiymat qabul qilishi kerak, shu jumladan, tabiiyki, konstruktor orqali yoki to’g’ridan-to’gri onasidan o’tganlari ham (q. Avto1.Tezlik=88).

Vorislikni ta‘qiqlash


Buning uchun C# tilida maxsus kalit so’zlar mavjud. Agar biror sinfga belgi qo’yilsa, shu sinfdan vorislik olish mumkin emas. Bu so’z – sealed1 so’zi orqali amalga oshiriladi.


Agar yuqoridagi Avto nomli ona sinfni quyidagicha e’lon qilamiz:

sealed class Avto


Endi ushbu sinfdan vorislik olaylik:


class My_Avto : Avto


Bu holatda kompilyator xatolik haqida xabar beradi.


C# tilida oldindan mavjud bo’lgan juda ko’plab sinflardan vorislik olib bo’lmaydi. Masalan,

class My_String : string { }


deb yozish aslo mumkin emas. Chunki String sinf “muhrlab qo’yilgan”.




Konstruktorlar va vorislik


Sinflar iyerarxiyasida, bazali sinflar va hosila sinflar uchun xususiy konstruktorlar ishtirok eta oladi. Shu holatli asosli savol paydo bo’ladi: qaysi konstruktor sinfning hosilasi obyektini qurishga javob bera oladi? Bazali sinf konstruktorimi, hosila sinf konstruktorimi yoki ikkilasi hammi? Bu savolga shunday javob beramiz: bazali sinfning konstruktori obyektning bazali qismini konstruksiyalaydi, hosila sinfning konstruktori esa, bu obyektning hosila qismini konstruksiyalaydi. Va bunda mantiqan, bazali sinfda noma’lum bo’lgan va hosila sinfning istalgan elementiga ruxsat etilmaganlari bir qancha, demak, u alohida konstruksiyalangan bo’ladi.


Agar konstruktor faqat bazali sinfda aniqlanganda (bunda maxsuslashtirilgan konstruktor deb nomlanadi, ya’ni parametrlari bilan), barchasi juda oddiy bo’ladi: hosila sinfning obyekti konstruksiyalanadi, obyektning bazali qismi esa, jimlik bo’yicha avtomatik konstruksiyalanadi (bazali sinfda konstruktor yo’q, taxminimizcha, demak, u jimlik bo’yicha olinadi).
Agar konstruktor bazali sinfda aniqlansa, obyektni qurishda biroz jarayon murakkablashadi, ikkila sinfda bir konstruktorlarni joriy qilishga to’g’ri keladi. Bazali sinfda ko’plab konstruktorlar bo’lishi mumkin. Aniq holatda ulardan qaysi birini joriy qilish kerak? Bazali sinfdagi kerakli konstruktorni ishga joriy etish uchun base kalit so’zidan foydalanishga to’g’ri keladi.
Hosila sinfda bazali sinfdagi konstruktorni e’lon qilish formasi umumiy ko’rinishda quyidagicha bo’ladi:

hosila_sinf konstruktori (parametrlar ro’yxati): base (parametrlar ro’yxati)


{
//konstruktorning tanasi
}

Bu yerda base (parametrlar ro’yxati) – bundagi parametrlar bazali sinfdagi kerakli konstruktorni ishga yurgizish uchun qo’llaniladi. Qaysi konstruktorni ishga yurgizish kerak bo’lsa, kompilyator uning miqdori va parametr tiplari bo’yicha aniqlaydi. Maydon initsializatsiyalashtirilgandan keyin, obyektning hosilasiga ma’lum bo’ladi.


Quyidagi misolni ko’raylik (8.11-listing).



Download 46.81 Kb.

Do'stlaringiz bilan baham:
1   2   3




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