Microsoft Word atd ma'ruzalar matni amat
Download 71.65 Kb. Pdf ko'rish
|
3-maruza (2)
3-ma’ruza. Interfeyslar. Interfeyslarda metodlardan foydalanish va ularni qayta aniqlash. Interfeys obʼektlarini nusxalash va tartiblash. Insterfeyslarning aniqlanishi Ruxsat modifikatorlari Sukut boʻyicha realizatsiya Interfeysni qoʻshish Interfeys – soʻzma-soʻz oʻzaro ta’sirlashuv ma’nosini bildiradi. Bizning holatda esa bu boshqa dasturlar yoki ularning qismlari o'rtasidagi o'zaro ta'sirni ta'minlaydigan dastur. C# dasturlash muhiti doirasida interfeyslar – bu bitta nom ostida birlashgan qandaydir abstract a’zolar. Bu abstract sinflar kabi, lekin torroq doirada. Abstrakt sinflar, abstract a’zolardan tashqari yana konstruktorlar, ma’lumotlar maydoni, abstract boʻlmagan a’zolardan tarkib topadi. Interfeyslar esa faqat abstract a’zolardan tarkib topgan. Insterfeyslarning aniqlanishi Interfeyslarni aniqlash uchun interface kalit soʻzidan foydalaniladi. Qoida boʻyicha, C# da interfeyslar nomi I bosh harfidan boshlanadi, masalan, IComparable, IEnumerable, biroq bu shart boʻlmagan talab, balki koʻproq dasturlash stili hisoblanadi. Interfeys nimani aniqlashi mumkin? Umuman qolganda interfeyslar quyidagilarni aniqlashi mumkin: - Metodlar - Xossalar - Indeksatorlar - Xodisalar - Statik maydon va konstantalar (C# 8.0 versiyadan boshlab) Biroq interfeyslar static boʻlmagan oʻzgaruvchilarni aniqlay olmaydi. Masalan, quyidagi barcha komponentalarni aniqlovchi sodda interfeys: interface IMovable { // konstanta const int minSpeed = 0; // minimal tezlik // static oʻzgaruvchi static int maxSpeed = 60; // maksimal tezlik // metod void Move(); // harakat // xossa string Name { get; set; } // nom delegate void MoveHandler(string message); // xodisa uchun delegatni aniqlash // xodisa event MoveHandler MoveEvent; // harakat hodisasi } Bu holatda ba’zi ob’yektlar harakatini ifodalovchi IMovable interfeysi aniqlangan. Bu interfeys harakatlanuvchi ob’yektlar imkoniyatlarini tavsiflovchi turli komponentalardan tarkib topgan. Ya’ni interfeys harakatlanuvchi ob’yektda boʻlishi kerak boʻlgan ba’zi funksionallarni tavsiflaydi. Interfeys metod va xossalari realizatsiyaga ega boʻlmasligi mumkin, bu bilan ular abstract sinflardagi abstract metod va xossalarga yaqinlashadi. Bu holatda interfeys ba’zi harakatlarni ifodalovchi Move metodini aniqlaydi. U realizatsiyaga ega emas, hech qanday parametr qabul qilmaydi va hech narsa qaytarmaydi. Xuddi shi holat Name xossasiga ham tegishli. Bir qarashda u avtomatik xossaga oʻxshash. Aslida esa bu interfeysda realizatsiyaga ega boʻlmagan aniqlash, avtoxossa emas. Ruxsat modifikatorlari Interfeysdagi yana bir vaziyat: agar uning a’zolari – metodlar va xossalar ruxsat modifikatorlariga ega boʻlmasa, interfeys maqsadi – uning sinflari realizatsiyasi uchun funksionalni aniqlash kabi sukut boʻyicha public ruxsatiga ega boʻladi. Bu sinf va strukturalarda sukut boʻyicha private modifikatoriga ega boʻlgan konstanta va static oʻzgaruvchilarga ham tegishli. Interfeyslarda ular sukut boʻyicha public modifikatoriga ega boʻladi. Masalan, biz IMovable interfeysi minSpeed konstantasiga va maxSpeed oʻzgaruvchisiga murojaat qilishimiz mumkin: Console.WriteLine(IMovable.maxSpeed); // 60 Console.WriteLine(IMovable.minSpeed); // 0 Xuddi shuningdek, C# 8.0 versiyasidan boshlab, biz interfeys komponentalarining ruxsat modifikatorlarini aniq koʻrsatishimiz mumkin: interface IMovable { public const int minSpeed = 0; // minimal tezlik private static int maxSpeed = 60; // maksimal tezlik public void Move(); protected internal string Name { get; set; } // nomi public delegate void MoveHandler(string message); //xodisa uchun delegatni aniqlash public event MoveHandler MoveEvent; // harakat hodisasi } Sinflar kabi interfeyslar ham sukut boʻyicha internal ruxsat darajasiga ega, ya’ni bunday interfeys faqat joriy loyiha doirasida oʻrinli. Lekin public modifikatori bilan biz interfeysi umumruxsat etilgan qilishimiz mumkin: public interface IMovable { void Move(); } Sukut boʻyicha realizatsiya C# 8.0 versiyasidan boshlab interfeyslar sukut boʻyicha metod va xossalar realizatsiyasini qoʻllab quvvatlaydi. Bu shuni bildiradiki, biz interfeysda oddiy sinf va strukturalardagi kabi realizatsiyaga ega toʻliq metod va xossalarni aniqlashimiz mumkin. Masalan, sukut boʻyicha Move metodi realizatsiyasini aniqlaymiz: interface IMovable { // sukut boʻyicha metod realizatsiyasi void Move() { Console.WriteLine("Walking"); } } Interfeysda sukut boʻyicha xossa realizatsiyasi birmuncha murakkabroq, interfeysda static boʻlmagan oʻzgaruvchilarni aniqlay olmaganligimiz sababli, interfeys xossalarida biz ob’yekt holatini boshqara olmaymiz. Shunga qaramasdan xossalar uchun sukut boʻyicha realizatsiyani aniqlashimiz mumkin: interface IMovable { // sukut boʻyicha metod realizatsiyasi void Move() => Console.WriteLine("Walking"); // sukut boʻyicha xossa realizatsiyasi // faqat oʻqish uchun xossa int MaxSpeed { get { return 0; } } } Shuni e’tiborga olish kerakki, agar interfeys private metod va va xossalarga ega boʻlsa, u holda ular sukut boʻyicha realizatsiyaga ega boʻlishi kerak. Xuddi shu static metodlarga ham tegishli (private boʻlishi shart emas): Console.WriteLine(IMovable.MaxSpeed); // 60 IMovable.MaxSpeed = 65; Console.WriteLine(IMovable.MaxSpeed); // 65 double time = IMovable.GetTime(500, 10); Console.WriteLine(time); // 50 interface IMovable { public const int minSpeed = 0; // minimal tezlik private static int maxSpeed = 60; // maksimal tezlik // speed tezligida distance masofasini oʻtish uchun kerak boʻladigan vaqtni topamiz static double GetTime(double distance, double speed) => distance / speed; static int MaxSpeed { get => maxSpeed; set { if (value > 0) maxSpeed = value; } } } Interfeysni qoʻshish Visual Studioda alohida faylga yangi interfeysni qoʻshish uchun maxsus komponenta mavjud. Interfeysni loyihaga qoʻshish uchun loyiha ustida sichqonchaning oʻng tugmasi bosiladi va hosil boʻlgan kontekstli menyuda Add-> New Item... tanlanadi va yangi component qoʻshish muloqot oynasida Interface boʻlimi tanlanadi: Biz sinfning standart faylini yoki C# kodi ixtiyoriy faylini ham qoʻshishimiz hamda unda interfeysni aniqlashimiz mumkin. Nazorat uchun savollar 1-savol. Quyidagi interfeyslarni aniqlashda nima notoʻgʻri: public abstract interface IAction { void Move(); } internal interface IRunAction : IAction { void Run(); } Javob variantlari (javoblar bir nechta boʻlishi ham mumkin): - Interfeyslar internal ruxsat modifikatoriga ega boʻla olmaydi - Interfeyslar abstract modifikatoriga ega boʻla olmaydi - IRunAction interfeysi Move metodini aniqlashi kerak, chunki IAction asosiy interfeysi abstract hisoblanadi - Abstract interfeysdan voris olish mumkin emas Javob. Interfeyslar abstract modifikatoriga ega boʻla olmaydi. 2-savol. Quyidagi dastur kodi berilgan: using System; namespace HelloApp { class Program { static void Main(string[] args) { IAction action = new RunAction(); action.Move(); Console.ReadKey(); } } class RunAction : IRunAction { internal void Move() { Console.WriteLine("I am running"); } } interface IAction { void Move(); } interface IRunAction : IAction { new void Move(); } } Nima uchun bu dastur kompilyatsiyalanmaydi? Javob variantlari: - chunki IRunActionda Move metodi new kalit soʻzi bilan aniqlangan - chunki ikkala interfeysda ham Move metodi aniqlangan, dastur esa qaysi biriga murojaat qilishni bilmaydi - RunAction sinfida Move metodi internal modifikatori bilan aniqlangan - Chunki RunAction sinfi har bir interfeys uchun ikkita Move metodi realizatsiyasini aniqlashi kerak Javob. Sinfda interfeys metodi realizatsiyasida bu metod faqat public modifikatoriga ega boʻlishi kerak. Realizatsiyani aniqlashda internal modifikatori toʻgʻri emas. 3-savol. Tester sinfi IFoo va IBar interfeyslarini qoʻllaydi: interface IFoo { void Execute(); } interface IBar { void Execute(); } class Tester : IFoo, IBar { public void Execute() { Console.WriteLine("Tester Executes"); } } Tester sinfi aynan qaysi interfeysning Execute() metodini qoʻllaydi? Javob. Tester sinfi bir yoʻla ikkala interfeysning ham Execute metodini qoʻllaydi. 4-savol. Tester sinfi IFoo va IBar interfeyslarini qoʻllaydi: interface IFoo { void Execute(); } interface IBar { void Execute(); } class Tester : IFoo, IBar { void IFoo.Execute() { Console.WriteLine("IFoo Executes"); } void IBar.Execute() { Console.WriteLine("IBar Executes"); } } Quyidagi kodda qaysi interfeysdan Execute() metodi realizatsiya qilinadi: Tester t = new Tester(); t.Execute(); Javob. Yuqorida keltirilgan kod kompilyatsiyalanmaydi. Qaysi interfeysdan realizatsiya qilishimiz kerakligini aniq koʻrsatishimiz kerak, masalan, quyidagi shaklda: Tester t = new Tester(); (t as IFoo).Execute(); Foydalanish uchun adabiyot va manbalar: 1. Троелсен Эндрю, Джепикс Филипп. Язык программирования C# 7 и платформы .NET и .NET Core. Вильямс. 2018 2. A. Troelsen, P. Japikse. Pro C# 8 with .NET Core. Foundational Principles and Practices in Programming. Apress, 2020 3. Албахари Бен, Албахари Джозеф. C# 7.0. Справочник. Полное описание языка. Пер. с англ.-СПб: “Альфа-книга”, 2018, -1024 с. 4. https://metanit.com/sharp/tutorial/3.9.php 5. https://www.youtube.com/watch?v=tVbOmPm78-E&list=PLL- k0Ff5RfqXGhAooRkUpzMLd6_Fpr13I&index=39 Download 71.65 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling