Uploaded by Google Account

OYD asoslari: C# da sinflar va ob'ektlar

advertisement
21-Mavzu: Ob’ektga yo‘naltirilgan dasturlash (OYD) asosi. OYD
tushunchasi. OYD tamoyillari. OYD paradigmalari.
Reja:
1. Ob’ektga yo‘naltirilgan dasturlash (OYD) asosi.
2. OYD tushunchasi. OYD tamoyillari. OYD paradigmalari.
C # - ob'ektga yo'naltirilgan to'liq til. Bu shuni anglatadiki, C # dasturi o'zaro
bog'langan o'zaro ta'sir qiladigan ob'ektlar sifatida ifodalanishi mumkin.
Ob'ektning tavsifi - bu sinf, va ob'ekt bu sinfning namunasini ifodalaydi. Quyidagi
o'xshashlikni ham chizishingiz mumkin. Hammamizda ism, yosh va boshqa
xususiyatlarga ega bo'lgan odam haqida ba'zi tasavvurlar mavjud. Ya'ni, ba'zi bir
shablon - bu shablonni sinf deb atash mumkin. Ushbu naqshning aniq timsoli farq
qilishi mumkin, masalan, ba'zi odamlar bitta ismga, boshqalari boshqa nomga ega.
Haqiqiy shaxs (aslida ushbu sinfning namunasi) ushbu sinfning ob'ektini
ifodalaydi.
Odatiy bo'lib, konsol dastur loyihasi allaqachon bitta dastur sinfini o'z ichiga oladi,
undan dastur bajarilishi boshlanadi.
Aslida, sinf foydalanuvchi tomonidan belgilangan yangi turni ifodalaydi. Sinf kalit
so'zi yordamida aniqlanadi:
public class Talaba
{
public string name;
public int age;
public string guruh_nomer;
}
Sinf nom maydonida, nom maydonidan tashqarida, boshqa sinf ichida
aniqlanishi mumkin. Odatda, sinflar alohida fayllarga joylashtiriladi. Ammo bu
holda, Dastur sinfi joylashgan faylga yangi sinf qo'yamiz. Ya'ni, Program.cs fayli
quyidagicha ko'rinadi:
using System;
namespace Dasturlash
{
public class Talaba
{
public string name;
public int age;
public string guruh_nomer;
}
class Asosiy_sinf
{
static void Main(string[] args)
{
}
}
}
Sinfning barcha funktsional imkoniyatlari uning a'zolari - maydonlar (maydonlar
sinf o'zgaruvchilari deyiladi), xususiyatlari, usullari, hodisalari bilan ifodalanadi.
Masalan, Talaba sinfidagi maydonlarni va usulni aniqlaylik:
using System;
namespace Dasturlash
{
public class Talaba
{
public string name;
public int age;
public string guruh_nomer;
public void GetInfo()
{
Console.WriteLine($"Ismi: {name}
}
yoshi: {age}");
}
class Asosiy_sinf
{
static void Main(string[] args)
{
Talaba T;
}
}
}
Bunday holda, Talaba klassi shaxsni anglatadi. Ism maydoni ismni, yosh maydoni
esa odamning yoshini ushlab turadi. GetInfo usuli barcha ma'lumotlarni konsolga
chiqaradi. Talaba sinfidan tashqarida barcha ma'lumotlarni olish uchun
o'zgaruvchilar va usul umumiy modifikator bilan aniqlanadi. Maydonlar aslida bir
xil o'zgaruvchiga ega bo'lganligi sababli, ularni boshlash mumkin, yuqoridagi kabi,
yosh maydoni 38 ga boshlangan.
Sinf yangi tur bo'lgani uchun dasturda biz ushbu turni ifodalaydigan o'zgaruvchilarni
aniqlashimiz mumkin. Demak, bu erda Main usulida Talaba sinfini ifodalovchi T
o'zgaruvchisi aniqlangan. Ammo hozircha ushbu o'zgaruvchi hech qanday ob'ektga
ishora qilmaydi va u sukut bo'yicha nolga teng. Shuning uchun avval Talaba
sinfining ob'ekti yaratilishi kerak.
Konstruktorlar
Oddiy usullardan tashqari sinflarda konstruktor deb nomlangan maxsus usullar ham
qo'llaniladi. Ushbu sinfning yangi ob'ekti yaratilganda konstruktorlar chaqiriladi.
Konstruktorlar ob'ektni ishga tushirishni amalga oshiradilar.
Standart konstruktor
Agar sinfda hech qanday konstruktor aniqlanmagan bo'lsa, u sinf uchun avtomatik
ravishda sukut bo'yicha konstruktor yaratiladi. Bunday konstruktorning parametrlari
va tanasi yo'q.
Yuqoridagi Talaba sinfida hech qanday konstruktor mavjud emas. Shuning uchun u
uchun avtomatik ravishda standart konstruktor hosil bo'ladi. Va biz ushbu
konstruktordan foydalanishimiz mumkin. Xususan, Talaba sinfining bitta ob'ektini
yarataylik:
using System;
namespace Dasturlash
{
public class Talaba
{
public string name;
public int age;
public int guruh_nomer;
public void GetInfo()
{
Console.WriteLine($"Ismi: {name}
yoshi: {age}");
}
}
class Asosiy_sinf
{
static void Main(string[] args)
{
Talaba T=new Talaba();
Console.Write("Ismingizni kiriting: ");
T.name = Console.ReadLine();
Console.Write("Yoshingizni kiriting: ");
T.age = Convert.ToInt32(Console.ReadLine());
Console.Write("Guruh nomeringizni kiriting: ");
T.guruh_nomer = Convert.ToInt32(Console.ReadLine());
T.GetInfo();
}
}
}
Talaba ob’ektini yaratish uchun new Talaba () iborasi ishlatiladi. Yangi operator
Talaba ob'ekti uchun xotira ajratadi. Keyin standart parametrlar chaqiriladi, bu esa
hech qanday parametrlarni talab qilmaydi. Natijada, ushbu ifoda bajarilgandan
so'ng, Talaba ob'ektining barcha ma'lumotlari saqlanadigan bo'limga xotirada
ajratiladi. T o'zgaruvchisi yaratilgan ob'ektga mos yozuvlar oladi.
Agar konstruktor ob'ekt o'zgaruvchilarining qiymatlarini initsializatsiya qilmasa, u
holda ular standart qiymatlarni oladi. Raqamli turlarning o'zgaruvchilari uchun bu
raqam 0 ga teng, tip satrlari va sinflar uchun u null (ya'ni deyarli hech qanday
qiymatga ega emas).
Ob'ektni yaratgandan so'ng, biz o'zgarmaydigan T orqali Talaba ob'ekti
o'zgaruvchilariga kirishimiz va ularning qiymatlarini o'rnatishimiz yoki olishimiz
mumkin, masalan, T.name = "Oybek";.
Konstruktorlarni yaratish
Yuqorida, ob'ektni ishga tushirish uchun standart konstruktor ishlatilgan. Biroq, biz
o'zimiz konstruktorlarni aniqlashimiz mumkin:
using System;
namespace Dasturlash
{
public class Talaba
{
public string name;
public int age;
public int guruh_nomer;
public Talaba() { name = "Noma'lum"; age = 18; }
// 1 конструктор
public Talaba(string n) { name = n; age = 18; }
// 2 конструктор
}
public Talaba(string n, int a) { name = n; age = a;
// 3 конструктор
public void GetInfo()
{
Console.WriteLine($"Ismi: {name}
yoshi:
{age}");
}
}
class Asosiy_sinf
{
static void Main(string[] args)
{
Talaba T=new Talaba();
Console.Write("Ismingizni kiriting: ");
T.name = Console.ReadLine();
Console.Write("Yoshingizni kiriting: ");
T.age = Convert.ToInt32(Console.ReadLine());
Console.Write("Guruh nomeringizni kiriting: ");
T.guruh_nomer =
Convert.ToInt32(Console.ReadLine());
Console.Write("Ismingizni kiriting: ");
Talaba M = new Talaba(Console.ReadLine());
Talaba N = new Talaba(Console.ReadLine(),
Convert.ToInt32(Console.ReadLine()));
T.GetInfo();
M.GetInfo();
M.GetInfo();
}
}
}
This kalit so'z
This kalit so'z sinfning joriy nusxasiga havolani anglatadi. Qanday
vaziyatlarda biz uchun foydali bo'lishi mumkin? Yuqoridagi misolda uchta
konstruktor aniqlangan. Uchala konstruktor ham xuddi shu narsani qiladi - ular ism
va yosh maydonlarining qiymatlarini o'rnatadilar. Ammo bu takrorlanadigan
harakatlar ko'proq bo'lishi mumkin edi. Biz konstruktorlarning funktsiyalarini
takrorlay olmaymiz, faqat parametrlar uchun kerakli qiymatlarni o'tkazib, ushbu
kalit so'z orqali bitta konstruktordan boshqasiga murojaat qilamiz:
class Talaba
{
public string name;
public int age;
public int guruh_nomer;
public Talaba(): this("Noma'lum")
{
}
public Talaba(string name):this(name,25)
{
}
public Talaba(string name, int age)
{
this.name = name;
this.age = age;
}
public void GetInfo()
{
Console.WriteLine($"Ismi: {name}
yoshi: {age}");
}
}
Bunda birinchi konstruktor ikkinchisini, ikkinchi konstruktor uchinchisini
chaqiradi. Parametrlar soni va turi bo'yicha kompilyator qaysi konstruktor
chaqirilishini biladi. Masalan, ikkinchi konstruktorda:
public Talaba(string name):this(name,25)
{
}
Ikkita konstruktorga chaqiruv mavjud, unga ikkita qiymat o'tkaziladi. Bundan
tashqari, boshida u bajariladigan uchinchi konstruktor bo'ladi va shundan keyingina
ikkinchi konstruktorning kodi bo'ladi.
Shuni ham ta'kidlash joizki, uchinchi konstruktorda parametrlar sinf maydonlari
bilan bir xil nomlangan.
public Talaba(string name, int age)
{
this.name = name;
this.age = age;
}
Sinfning parametrlari va maydonlarini farqlash uchun sinf maydonlariga ushbu kalit
so'z orqali kirish mumkin. Shunday qilib, ifoda this.name = name; this.name-ning
birinchi qismi bu nom parametri nomi emas, balki joriy sinfning maydonini
bildiradi. Agar bizning parametrlarimiz va maydonlarimiz boshqacha nomlangan
bo'lsa, unda bu so'zni ishlatish kerak bo'lmaydi. Bundan tashqari, ushbu kalit so'z
orqali siz istalgan maydon yoki usulga murojaat qilishingiz mumkin.
Ob'ektni insializatsiyalash
Initsializatorlar sinf ob'ektlarini initsializatsiya qilish uchun ishlatilishi
mumkin. Initsializatorlar ob'ektning mavjud maydonlariga va xususiyatlariga
jingalak qavsdagi o'tish qiymatlarini ifodalaydi:
Talaba T = new Talaba { name = "Oybek", age = 38 };
T.GetInfo();
using System;
namespace Dasturlash
{
class Talaba
{
public string name;
public int age;
public int guruh_nomer;
public Talaba(): this("Noma'lum")
{
}
public Talaba(string name):this(name,25,101)
{
}
public Talaba(string name, int age, int guruh_nomer)
{
this.name = name;
this.age = age;
this.guruh_nomer = guruh_nomer;
}
public void GetInfo()
{
Console.WriteLine($"Ismi: {name}
guruh raqami: {guruh_nomer}");
}
}
yoshi: {age}
class Asosiy_sinf
{
static void Main(string[] args)
{
Talaba T = new Talaba { name = "Oybek", age = 38 };
T.GetInfo();
Talaba M = new Talaba(Console.ReadLine());
Talaba N = new Talaba(Console.ReadLine(),
Convert.ToInt32(Console.ReadLine()),
Convert.ToInt32(Console.ReadLine()));
T.GetInfo();
M.GetInfo();
N.GetInfo();
}
}
}
Ob'ektni ishga tushirish vositasidan foydalanib, konstruktorni aniq
chaqirmasdan, ob'ektni yaratish vaqtida barcha mavjud maydonlarga va
xususiyatlarga qiymatlarni belgilashingiz mumkin.
Initsializator yordamida biz faqat tashqi koddan mavjud bo'lgan maydonlar va
ob'ekt xususiyatlarining qiymatlarini o'rnatishimiz mumkin. Masalan, yuqoridagi
misolda ism va yosh maydonlari ochiq foydalanish modifikatoriga ega, shuning
uchun ularga dasturning istalgan joyidan kirish mumkin.
Boshlovchi konstruktordan keyin bajariladi, shuning uchun ham
konstruktorda, ham initsializatorda bir xil maydon va xossalarning qiymatlari
o'rnatilgan bo'lsa, konstruktorda o'rnatilgan qiymatlar boshlang'ichdan olingan
qiymatlar bilan almashtiriladi.
Download