Interfeys toifalari tushunchasi Interfeys toifalarni abstract bazaviy sinflar bilan taqqoslash Maxsus interfeyslarni kiritish


Interfeys toifalarni abstract bazaviy sinflar bilan taqqoslash


Download 0.77 Mb.
bet2/50
Sana26.01.2023
Hajmi0.77 Mb.
#1129439
1   2   3   4   5   6   7   8   9   ...   50
Bog'liq
MAVZULAR UMUMIY

Interfeys toifalarni abstract bazaviy sinflar bilan taqqoslash
Interfeys toifasi qaysidir jixatlari bilan abstract bazaviy sinflarga o’xshash tuyulishi mumkin. Esingizda bo’lsa, sinf abstract sifatida belgilanganida barcha voris toifalarga polimorf interfeysni ta’minlash uchun ixtiyoriy miqdordagi abstract a’zolarni o’z ichiga olishi mumkin. Biroq hatto agar sinf chindan ham abstract a’zolar to’plamini aniqlasa, u shuningdek ixtiyoriy miqdordagi konstruktorlar, ma’lumotlar maydonlari, noabstrakt a’zolarni (realizatsiyasi bilan birga) ham aniqlashi mumkin. Boshqa tomondan, interfeyslar faqat a’zolarning ta’riflarini o’z ichiga oladi.
Abstrakt ajdod sinf tomonidan o’rnatiladigan polimorf interfeys bitta jiddiy cheklanishga (kamchilikka) ega: abstract ajdod sinf tomonidan aniqlangan a’zolar faqat voris toifalar bilan qo’llab-quvvatlanadi. Shunga qaramasdan, yirik dasturiy tizimlarda ko’pincha System.Object dan boshqa umumiy ajdodga ega bo’lmagan sinflarning son-sanoqsiz shajaralari ishlab chiqariladi. Abstrakt bazaviy sinfning abstract a’zolari faqat voris toifalarga qo’llanilishini inobatga olsak, aynan bitta polimorf interfeysni qo’llash uchun turli shajaralarda toifalarni sozlashning biror bir usuli mavjud emas. Misol tariqasida ushbu abstract sinf aniqlangan deb faraz qilaylik:
public abstract class CloneableType
{
// Bu “polimorf interfey”ni faqat voris toifalar qo’llashi mumki
// Boshqa shajaralardagi sinflar bu abstract a’zoga murojaat qila olmaydi
public abstract object Clone ();
}
Bunday aniqlanishda Clone() metodini faqat CloneableType ni kengaytiruvchi sinflargina qo’llay oladilar. Agar bu bazaviy sinfni kengaytirmaydigan sinflarning yangi majmuasi (nabori, to’plami) yaratilsa, u holda bu polimorf interfeysdan foyda chiqarib bo’lmaydi. Buning ustiga ustak, yodingizda bo’lsa, C# tili ko’pvorislilikni qo’llab-quvvatlamaydi. Shu sababga ko’ra, agar siz ham Car, ham CloneableType bo’ladigan MiniVan sinfini yaratmoqchi bo’lsangiz, quyidagicha ish tutib bo’lmaydi:
// Mumkinmas! Chunki C# da ko’pvorislilik yo’q
public class MiniVan : Car, CloneableType
{
}
Aynan mana shunday vaziyatlarda interfeys toifalari asqotib qoladi. Interfeys aniqlab bo’linganidan keyin, u istalgan shajarada va istalgan ismlar fazosi yoki sborkada (.NET ning istalgan dasturlash tilida yozilgan sborkada), ixtiyoriy sinf yoki struktura tomonidan realizatsiya qilinishi mumkin. Ko’rib turibsizki, interfeyslar nihoyatda polimorfdir. .NETning ICloneable deb nomlangan va System nomlar fazosida aniqlangan standart interfeysini ko’rib chiqaylik. Unda Clone() deb atalgan yagona metod aniqlangan:
public interface ICloneable
{
object Clone ();
}
.NET Framework 4.7 SDK ning hujjatlariga nazar tashlasangiz, ICloneable interfeysi ko’rinishidan bir-biriga bog’liq bo’lmagan juda ko’p toifalarda (System.Array, System.Data.SqliClient.SqlConnection, System.OperatingSystem, System.String va h.k.) realizatsiya qilinganini ko’rasiz. Garchi ko’rsatilgan toifalar umumiy ajdodga (System.Object dan boshqa) ega bo’lmasa ham, ularga polimorf tarzda ICloneable interfeys toifasi orqali ishlov berish mumkin. Quyidagi oddiy Program sinfini ko’rib chiqaylik:
class Program
{
static void Main(string [ ] args)
{
Console.WriteLine ("***** Interfayslarga Birinchi Nazar *****\n");
// Bu barcha sinflar ICloneable interfeysini qo’llaydi
string myStr = "Hello";
OperatingSystem unixOS = new OperatingSystem(PlatformID.Unix, new Version());
System.Data.SqlClient.SqlConnection sqlCnn =
new System.Data.SqlClient.SqlConnection();
// Demak, bularning hammasi ICloneable toifali parametrni qabul qiluvchi
// metodga uzatilishi mumkin
CloneMe(myStr);
CloneMe(unixOS);
CloneMe(sqlCnn);
Console.ReadLine();
}

private static void CloneMe(ICloneable c)


{
// Olingan narsani klonlashtirish va ismini ekranga yozish.
object theClone = c.Clone();
Console.WriteLine("Sizning klon: {0} dir", theClone.GetType().Name);
}
Mazkur dastur ishga tushirilganidan keyin System.Object dan vorislangan GetType() metodi vositasida har bir sinfning ismi chiqariladi kompyuter ekraniga. Bu metod va .NETning refleksiya xizmatlari har qanday toifaning tuzilishini dastur ijrosi paytida ko’rib chiqish (aniqlash) imkonini beradi. Quyida yuqoridagi dastur ekranga chiqargan ma’lumotlar ko’rsatilgan:
***** Interfayslarga Birinchi Nazar *****
Sizning klon String dir
Sizning klon OperatingSystem dir
Sizning klon SqlConnection dir

Abstract bazaviy sinflarga oid yana bir cheklov har bir voris sinf abstract a’zolarning hammasi uchun realizatsiya taqdim etilishi majburiyligi bilan bog’liqdir. Muammo nimadaligini anglash uchun geometric shaklarga oid Shakl bazaviy sinfida OlUchlarSonini() deb nomlangan yangi abstract metod e’lon qilingan deb faraz qilaylik, bu metod figurani chizish uchun uning uchlari miqdorini voris toifalarda qaytarishga mo’ljallangan:


abstract class Shakl
{
……………
// Bu metodni endi har bir voris sinf aniqlashi kerak bo’ladi!
public abstract byte OlUchlarSonini();
}
Ayonki, amalda uchlar soniga ega bo’lgan yagona sinf Kopburchak dir. Biroq endi kiritilgan yangilik sabab har bir voris sinf (Aylana, Ellips kabilar) OlUchlarSonini() degan metodning aniq realizatsiyasini taqdim etishga majbur bo’lib qoladi, hatto bu hech qanday mazmunga ega bo’lmasa ham. Va yana bunday muammo uchun interfeys toifasi yechim taqdim etadi. Agar Siz “uchlar mavjudligi”ni oydinlashtiruvchi interfeys kiritsangiz, u holda uni Kopburchak sinfiga taqdim etib, Aylana, Ellips kabilarni o’zgarisgsiz qoldirishingiz mumkin.


Download 0.77 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   50




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling