Microsoft Word atd ma'ruzalar matni amat


Download 71.65 Kb.
Pdf ko'rish
Sana23.11.2023
Hajmi71.65 Kb.
#1794827
Bog'liq
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