Interface

Interface

Shaxboz Shirinboyev

Mashina haydash uchun uning matori qanaqa ishlashini bilish shart emas. Porshin nima ekanligini bilish shart emas. Mashina murakkab mixanizlardan iborat. Lekin ularni tushunmasdan mashinaga ta’sir qilish mumkin. Bu haqida har xil ma’lumotlarni olish mumkin. Misol uchun tormoz va gaz pedallari orqali mashinaning tezligiga ta’sir qilish mumkin va ko’rsatkichlar orqali ayni vaqtdagi tezlikni bilish mumkin. Rul orqali esa mashinaning yo’nalishini o’zgartirishimiz mumkin. Ushbu rul, pedallar va ko’rsatkichlar interfeys deyiladi. Interfeys ni kelishuv deb tushunsak bo’ladi. Demak odamlar mashinalarda gaz va tormoz pedallari rul va tezlik ko’rsatkichi bo’lishini kelishib olishgan. Bundan ko’proq narsalar ham bo’lishi mumkin. Masalan 3 ta pedal. Lekin kamida kelishuvdagi barcha elementlar bo’lishi shart. Ularning qanday ishlashi mashina chiqaruvchi kompaniyalarga havola. Ya’ni bir kompaniya mashinalari boshqa kompaniya mashinalaridan keskin farq qiladi. Tashqi ko’rinishi va ularning matorlari, yoqilg’i turlari o’zga bo’lishi mumkin. lekin uning ruli, kamida ikkita pedali va tezlik ko’rsatkichi bo’ladi. Shuning uchun ham qanaqa mashina olishni bilmasakda, mashina haydashni o’rganishimiz mumkin. Kompyuterda ham shunaqa oynali interfeys degan tushuncha bor. Ushbu interfeysda barcha dasturlar oyna shaklida bo’lib ularni joylashuvini o’zgartirishimiz yoki (X) ekis tugmachasi orqali oynani yopishimiz mumkin. Oynali interfeyslar har xil. Windows operatsion tizimining oynalik interfeysi, Mac operatsion tizimining oynalik interfeysi. Linux operatsion tizimida esa bir qancha har xil oynali interfeyslar mavjud. Ushbu dasturlar har xil dasturchilar tomonidan yozilgan. Har xil tillarda yozilgan. Lekin asosiy qoidalari bir xil. Shuning uchun ham bir oynali interfeysni o’rganib boshqasiga o’tish qiyin emas.

Dasturlashda ham interfeys sinfda qanaqa usullar bo’lishi kerakligi aniqlab beradi.

interface Foo

{

           void bar(string baz);

}

Lekin usullarda qanaqa kod bo’lishi sinfning o’ziga havola qilib belgilangan. Usul ikki bosh va tana qismlaridan iboratdir.

void bar(string baz)

{

print bar;

}

Bosh qismiga uning nomi, qaytarish turi va parametrlari kiradi. Uning komandalari guruhi esa tana qismi deyiladi. Tushunib turganingizdek interfeys yaratish uchun usul bosh qismlarini bir guruh qilib, guruh oldidan interface kalit so’zini yozamiz. interface so’zidan keyin esa uning nomini yozamiz.

interface Foo

{

           void bar(string baz);

           void foo2(int bar2, bool baz2);

}

Oddiy sinf nomlaridan farq qilishi uchun keling har bir yaratayotgan interfiyslar nomi oxiridan Interface so’zini yozamiz. Xuddi sinflarda bo’lgani kabi endi biz FooInterface nomli yangi tur ham yaratdik.

void someFunction(FooInterface foo)

{

           print foo.foo2(1, true);

}

Bu yerda usulga qanaqa obyekt kelishidan qatiy nazar bemalol uning foo2 nomli usulini chaqirishimiz mumkin. Sababi biz faqat usul fooInterface turiga mansub obyektni qabul qilayabmiz. Bu turdagi interfaysda esa foo2 usuli bor ekanligini bilamiz.

Keling ushbu funksiyani chaqiramiz. Buning uchun avval biror bir obyekt yarataylik.

class Bar

{

}

Bar foo = new Bar;

someFunction(foo); // bu yerda xato

Lekin funksiyani chaqirmoqchi bo’lsak, komplyator bizga xatolikni ko’rsatadi. Chunki funksiyamiz foo interface turiga mansub bo’lgan obyekt kutayabdi. Biz esa bar turiga tegishli obyekt yubordik. Bar sinfimizda foo interfeysda bor usullarni amalga oshirish uchun, sinf nomidan so’ng implements kalit so’zini yozamiz. Undan so’ng esa FooInterface so’zini yozamiz. Implements so’zi biror bir sinf qaysidir interfeys amalga oshiradi ya’ni interfeysda ko’rsatilgan usul nomlarining tanalarini yozib chiqadi degan. Ushbu kodda bar sinfi foo interfeys interfeysini amalga oshiradi demoqdamiz. Kodni yurguzmoqchi bo’lsak yana xatolik yuz beradi. Komplyator bizga bar sinfida FooInterface da ko’rsatilgan usullar yo’q demoqda.

class bar implements FooInterface //bu yerda xato

{

}

bar foo = new Bar;

someFunction(foo);

Keling ushbu FooInterface da ko’rsatilgan usullarni qo’shamiz. Bu safar kodimiz to’g’ri ishlaydi.

class bar implements FooInterface

{

           void bar(string baz)

           {

                       print “Bar usuli chaqirildi”;

           }

string foo2(int bar2, bool baz2)

{

                       print “foo2 usuli chaqirildi”;

                       return “text”;

}

}

Bar foo = new Bar;

someFunction(foo);

Demak biz foo obyektini yaratdik va uni someFunction funksiyasiga yubordik. U yerda ushbu obyektning foo2 usuli chaqirildi. Demak ekranga ushbu text chiqadi “foo2 usuli chaqirildi”. Endi esa haqiqatga yaqinroq usul ko’ramiz.

interface LogInterface

{

           void info(string text);

}

LogInterface yarataylik Log deb sistemaning xabarlarni yozib qoldiruvchi sinflarga aytiladi. Xabarlarni fayllarda saqlovchi sinf yaratamiz.

class FileLog implements LogInterface

{

           void info(string text)

           {

                       //bu yerda text ni faylda saqlovchi kod bo’ladi

           }

}

Dasturimiz kerakli joylarda ushbu obyektimizni ishlatishi mumkin.

FileLog logger = new FileLog;

logger.info(“Test”);

Dasturning hech qaysi usullari FileLog sinfini qabul qilmasin. Buning o’rniga LogInterface interfyesini qabul qilsa ushbu FileLog sinfimizni vaqti kelganda oson boshqa sinf bilan almashtirishimiz mumkin. Misol uchun xabarlarni ma’lumotlar omborida saqlovchi sinf ham yarataylik.

class DbLog implements LogInterface

{

           void info(string text)

           {

                       //bu yerda textni ma’lumotlar omborida saqlovchi sinf bo’ladi

           }

}

//FileLog logger = new FileLog;

DbLog logger = new DbLog;

logger.info(“Test”);

Endi bizda LogInterface interfeysini amalga oshiruvchi ikkita sinf bor. Endi osongina FileLog sinfini DbLog sinfi bilan almashtirib qo’yishimiz mumkin. Agar interface mavzusini tushunishga qiynalgan bo’lsangiz havotir olmang, boshlovchi dasturchilar odatda Interface ni ishlatishmaydi. Agar tushungan bo’lsangiz ofarin bu rostan ham qiyin mavzu. Esingizdan chiqmasin usullar biror bir sinfni emas Interfiysni qabul qilishi to’g’riroq hisoblanadi.

foo(DbLog log)

{         

           //kod

}

foo(LogInterface log)

{

           //kod

}

Ko’proq qatorlik izoh - dasturlashda bir qatorlik izohlardan tashqari ko’proq qatorlik izohlar qoldirish iloji ham bor. Ushbu turdagi izohlarni boshlash uchun slash va yulduzcha belgisini qo’yamiz “/*”. Izohni yakunlash uchun esa aksincha yulduzcha va slash belgisini “*/” qo’yishimiz kerak bo’ladi.
Umumiy dasturlash teoriyasi
muallif: #Akmal_Kadirov
telegram: IT OnTime


Report Page