Загрузил Xoja Temirov

7

Реклама
7-Mavzu: Vorislik. Ichma – ich joylashgan sinflar (4 soat)
Mavzu: Voris sinflarni yaratish va foydalanish.
MASHG’ULOTNING MAQSADI: C# da voris sinflarni yaratish va foydalanishni o`rgatish.
MASHG’ULOTNING JIHОZI: Ko’rgazmali material: kompyuterning xotira qurilmalari.
MASHG’ULOT O’TISH VОSITASI: Pentium IV kоmpyuterlari (qo’shimcha qurilmalari)
bilan jihоzlangan kоmpyuter sinfi.
MASHG’ULOTNING BОRISHI:
a) Guruhning va xоnaning darsga tayyorligini aniqlash.
b) Yo’qlama qilish.
c) Avvalgi mashg’ulоtlarda o’tilganlarni takrоrlash bo’yicha suhbat o’tkazish:
o’tilgan mavzularni qisqacha takrоrshlash.
g) Yangi mavzuning bayoni: C# da voris sinflarni yaratish va foydalanish haqida
ma’lumotlar berish.
d) Kоmpyuter xоnasida mashg’ulоt оlib bоrish. O’rganganlari ustida mashq qilish.
e) Dars yakuni: Mustaqil ish uchun individual topshiriqlarni berish.
Ma’ruza mashg`ulot mavzu bayoni:
Meros olish. Merosxo'rlik (inheritance) - ob'ektga yo'naltirilgan dasturlashning muhim
nuqtalaridan biri. Meros orqali bir sinf boshqa sinfning funksionalligini egallashi mumkin.
Aytaylik, bizda individual shaxsni tavsiflovchi quyidagi Person klassi mavjud:
class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public void Display()
{
Console.WriteLine(Name);
}
}
Ammo kutilmaganda bizga korxona ishchisini - Employee sinfini tavsiflovchi sinf kerak
bo'ldi. Ushbu sinf Person sinfi bilan bir xil funktsiyani amalga oshirishi sababli, xodim ham
shaxs bo'lganligi sababli, Employee sinfini Person sinfining lotiniga (yoki merosxo'riga yoki
subklassiga) aylantirish oqilona bo'ladi, bu esa o'z navbatida asosiy sinf deb nomlanadi. sinf yoki
ota-ona (yoki superklass):
class Employee : Person
{
…
}
Ikki nuqtadan so'ng biz ushbu sinf uchun asosiy sinfni ko'rsatamiz. Employee sinfi
uchun Person asos bo'lib, shuning uchun Employee klassi Person sinfidagi barcha bir xil
xususiyatlarni, usullarni, maydonlarni meros qilib oladi. Merosga o'tmaydigan yagona narsa bu
asosiy sinf konstruktorlari.
Shunday qilib, meros _is-a (tegishli, ichida yotadi) munosabatlarini amalga oshiradi,
Employee sinfining ob'ekti ham Person sinfining ob'ekti hisoblanadi:
static void Main(string[] args)
{
Person p = new Person { Name = "Tom"};
p.Display();
p = new Employee { Name = "Sam" };
p.Display();
Console.Read();
}
Hamda Employee ob'ekti ham Person ob'ekti bo'lgani uchun biz quyidagicha
o'zgaruvchini aniqlashimiz mumkin: Person p = new Employee().
Odatiy bo'lib, barcha sinflar Object asosiy sinfidan meros qilib oladi, hatto biz aniq
meros o'rnatmasak ham. Shuning uchun, yuqorida tavsiflangan Person va Employee sinflari,
o'zlarining uslublaridan tashqari, Ob'ektlar sinfining usullariga ega bo'ladi: ToString(), Equals(),
GetHashCode() va GetType().
Dastlabki holat bo'yicha barcha sinflar meros qilib olinishi mumkin. Biroq, bir qator
cheklovlar mavjud:
Ko'p merosni qo'llab-quvvatlamaydi, sinf faqat bitta sinfdan meros olishi mumkin.



Hosil qilingan sinfni yaratishda, asosiy sinfga kirish turini ko'rib chiqing - olingan sinfga
kirish turi asosiy sinf bilan bir xil yoki cheklangan bo'lishi kerak. Ya'ni, agar asosiy sinf
internal kirish turiga ega bo'lsa, u holda olingan sinf internal yoki private kirish turiga
ega bo'lishi mumkin, ammo public emas.
Shu bilan birga, shuni ham hisobga olish kerakki, agar baza va hosil qilingan sinf har xil
yig'ilishlarda (loyihalarda) bo'lsa, u holda hosil bo'lgan sinf faqat public modifikatoriga
ega bo'lgan sinfdan meros olishi mumkin.
Agar sealed modifikatori bilan sinf e'lon qilingan bo'lsa, u holda bu sinf meros qilib
olinmaydi va hosil bo'lgan sinflarni yaratish mumkin emas. Masalan, quyidagi sinf
avlodlarni yaratishga yo'l qo'ymaydi:
sealed class Admin
{
}

Siz statik sinfdan sinfni meros qilib ololmaysiz.
Hosil qilingan sinfdan tayanch sinf a'zolariga kirish.
Person va Employee sinflariga qaytamiz. Employee barcha funktsiyalarni Person
sinfidan olgan bo'lsa-da, keling quyidagi holatda nima bo'lishini ko'rib chiqaylik:
class Employee : Person
{
public void Display()
{
Console.WriteLine(_name);
}
}
Ushbu kod ishlamaydi va xatoga yo'l qo'yadi, chunki _name o'zgaruvchisi private
modifikatori bilan e'lon qilingan va shuning uchun unga faqat Person sinfi kirish huquqiga ega.
Boshqa tomondan, Person sinfi biz foydalanishi mumkin bo'lgan Name umumiy mulkini
belgilaydi, shuning uchun quyidagi kod biz uchun yaxshi ishlaydi:
class Employee : Person
{
public void Display()
{
Console.WriteLine(Name);
}
}
Shunday qilib, hosil bo'lgan sinf faqat private protected (agar baza va olingan sinf bir
xil sinfdan meros olingan bo'lsa), public, internal (agar baza va olingan sinf bir xil sinfdan
meros olingan bo'lsa), protected va protected internal modifikatorlari bilan aniqlangan asosiy
sinf a'zolariga kira oladi.
Asosiy kalit so'z. Endi sinflarimizga konstruktorlarni qo'shaylik:
class Person
{
public string Name { get; set; }
public Person(string name)
{
Name = name;
}
public void Display()
{
Console.WriteLine(Name);
}
}
class Employee : Person
{
public string Company { get; set; }
public Employee(string name, string company)
: base(name)
{
Company = company;
}
}
Person sinfida Name xususiyatini o'rnatuvchi konstruktor mavjud. Employee sinfi bir
xil Name xususiyatini meros qilib oladigan va o'rnatganligi sababli, o'rnatish kodini yuz marta
yozmaslik, lekin qandaydir tarzda Person sinfining tegishli kodini chaqirish mantiqan to'g'ri
bo'ladi. Bundan tashqari, asosiy sinfning konstruktorida o'rnatilishi kerak bo'lgan yana bir
qancha xususiyatlar va parametrlar bo'lishi mumkin.
base kalit so'zi bilan biz asosiy sinfga murojaat qilishimiz mumkin. Bizning holatimizda
biz "Employee" sinfining konstruktorida nom va kompaniyani belgilashimiz kerak. Ammo biz
o'rnatish uchun nomni base(name) ifodasi yordamida tayanch sinf konstruktoriga, ya'ni Person
sinf konstruktoriga beramiz.
static void Main(string[] args)
{
Person p = new Person("Bill");
p.Display();
Employee emp = new Employee ("Tom", "Microsoft");
emp.Display();
Console.Read();
}
Hosil qilingan konstruktorlar. Konstruktorlar meros olayotganda olingan sinfga
o'tmaydi. Va agar asosiy sinf parametrlarsiz standart konstruktorni aniqlamasa, faqat
parametrlarga ega bo'lgan konstruktorlarni (Person bazasi bilan bo'lgani kabi) aniqlasa, u holda
hosil bo'lgan sinfda biz ushbu konstruktorlardan birini tayanch kalit so'z orqali chaqirishimiz
kerak. Masalan, Employee sinfidan konstruktor ta'rifini olib tashlang:
class Employee : Person
{
public string Company { get; set; }
}
Bunday holda biz xatoga yo'l qo'yamiz, chunki Employee klassi Person sinfiga to'g'ri
kelmaydi, ya'ni u asosiy sinf konstruktorini chaqirmaydi. Agar biz bir xil xususiyatlarni
o'rnatadigan biron bir konstruktorni qo'shsak ham, biz xatoga yo'l qo'yamiz:
public Employee(string name, string company)
{
Name = name;
Company = company;
}
Ya'ni, Employee sinfida asosiy kalit so'z orqali Person sinfining konstruktorini aniq
chaqirishingiz kerak:
public Employee(string name, string company)
: base(name)
{
Company = company;
}
Shu bilan bir qatorda, biz asosiy sinfda parametrsiz konstruktorni aniqlashimiz mumkin:
class Person
{
// sinf kodining qolgan qismi
// standart konstruktor
public Person()
{
FirstName = "Tom";
Console.WriteLine("Parametrlarsiz konstruktorni chaqirish");
}
}
Keyin asosiy sinfning konstruktoriga havola bo'lmagan har qanday hosil qilingan
sinfning har qanday konstruktorida ushbu standart konstruktor hali ham yashirincha chaqiriladi.
Masalan, quyidagi konstruktor.
public Employee(string company)
{
Company = company;
}
Aslida quyidagi konstruktorga teng bo'ladi:
public Employee(string company):base()
{
Company = company;
}
Konstruktorlarning chaqirilish tartibi. Sinf konstruktori chaqirilganda, avval asosiy
sinflarning konstruktorlari qayta ishlanadi, shundan keyingina hosil bo'lganlarning
konstruktorlari. Masalan, quyidagi sinflarni olamiz:
class Person
{
string name;
int age;
public Person(string name)
{
this.name = name;
Console.WriteLine("Person(string name)");
}
public Person(string name, int age) : this(name)
{
this.age = age;
Console.WriteLine("Person(string name, int age)");
}
}
class Employee : Person
{
string company;
public Employee(string name, int age, string company) : base(name, age)
{
this.company = company;
Console.WriteLine("Employee(string name, int age, string company)");
}
}
Employee ob'ekti yaratishda:
Employee tom = new Employee("Tom", 22, "Microsoft");
Biz quyidagi konsol natijanini olamiz:
Person(string name)
Person(string name, int age)
Employee(string name, int age, string company)
Natijada biz quyidagi uzviy bog`liq zanjirini olamiz.
1. Employee (string nomi, int age, string company) konstruktori birinchi bo'lib chaqiriladi.
Bu bajarilishini Person (string name, int age) konstruktoriga topshiradi
2. Person (string name, int age) konstruktori chaqiriladi, uning o'zi hali bajarilmagan va
bajarilishini Person (string name) konstruktoriga topshiradi.
3. Person(string name) konstruktori chaqiriladi, bu bajarishni System.Object sinfining
konstruktoriga topshiradi, chunki bu Person uchun standart standart sinf.
4. System.Object.Object() konstruktori bajariladi, so'ngra Person(string name)
konstruktoriga qaytariladi.
5. Person (string name) konstruktorining tanasi bajariladi, so'ngra ijro Person (string name,
int age) konstruktoriga qaytariladi.
6. Person(string name, int age) konstruktorining tanasi bajariladi, so'ngra ijro
Employee(string name, int age, string company) konstruktoriga qaytariladi.
7. Konstruktor tanasi Employee(string name, int age, string company) bajariladi. Bu
Employee ob'ekti yaratadi.
Topshiriqlar
Har bir masalada yechish jarayonida voris sinflarni yaratish va foydalanishga doir
dastur tuzing.
Adabiyotlar
1. Троелсен Эндрю, Джепикс Филипп | Язык программирования C# 7 и платформы .NET и
.NET Core. Вильямс. 2018.
2. Troelsen, P. Japikse. Pro C# 8 with .NET Core. Foundational Principles and Practices in
Programming. Apress, 2020
3. Кристиан Нейгел, Билл Ивьен, Джей Глинн, Карли Уотсон, Морган Скиннер. C# 4.0 и
платформа .NET 4 для профессионалов. – Изд. Вильямс, 2011, 1440 с.
4. Christian Nagel. PROFESSIONAL C# 7 and .NET Core 2.0. Wrox, 2018.
5. Madraximov Sh.F., Ikramov A.M. C++ tilida programmalash bo’yicha masalalar to’plami.
O’quv qo’llanma // Toshkent, O’zbekiston Milliy Universiteti, “Universitet” nashriyoti, 2017.
160 bet
https://metanit.com/sharp/tutorial/3.7.php
Скачать