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.