3. Umumlashtirilgan sinflarni ma’lum qilish.
Umumlashtirilgan turlarga kelsak, shuni yodda tutish kerakki, umumlashtirilgan turdagi bitta aniq variantga havolalar bir xil umumlashtirilgan turdagi boshqa variant bilan turga to'g'ri kelmaydi. Shunday qilib, agar yuqoridagi dasturga quyidagi kod satrini kiritsangiz, u tuzilmaydi.
iOb = strOb; // noto'g'ri!
Ikkala o'zgaruvchi, iOb va strOb Gen turiga ega bo'lishiga qaramay, ular har xil dalillarga ega, chunki ular turli xil dalillarga ega.
Umumiy xavfsizlik bilan odatiy xavfsizlikni kuchaytirish
Yuqoridagilar bilan bog'liq holda, quyidagi oqilona savol tug'iladi: agar umumlashtirilgan Gen sinfining o'xshash funktsiyasini umumlashtirishsiz olish mumkin bo'lsa, shunchaki ob'ektni ma'lumot turi sifatida ko'rsatish va kerakli turdagi translyatsiyani amalga oshirish orqali, Gen sinfini umumlashtirishdan nima foyda? Bu savolga javob shundaki, generiklar Gen sinfiga ta'sir qiladigan barcha operatsiyalar uchun avtomatik ravishda tipik xavfsizlikni ta'minlaydilar. Ushbu operatsiyalar davomida umumlashmalar turi konversiyalarga murojaat qilish zaruratini yo'q qiladi va ularning turlari qo'lda kodga muvofiqligini tekshiradi.
Umumlashtirilishning afzalliklarini tushunarli qilish uchun avval Gen sinfining yagona umumiy analogini yaratadigan dasturni ko'rib chiqamiz.
// NonGen klassi to'liq funktsional analogdir
// sinf Gen, lekin umumlashtirmasdan.
Tizimdan foydalanish;
sinf NonGen {
ob'ekt ob; // ob o'zgaruvchisi endi tip ob'ekti
// Konstruktorga ob'ekt ob'ekti uchun havolani yuborish,
ommaviy NonGen (ob'ekt o) {
ob = o;
}
// ob'ekt ob'ekti ob'ektini qaytaring,
jamoat ob'ekti GetOb () {
qaytish ob;
}
// O'zgaruvchan ob-havo turini ko'rsatish.
ommaviy bo'shliq ShowType () {
Console.WriteLine ("O'zgaruvchan turi ob:" + ob.GetType ());
}
}
// Umumiy bo'lmagan sinfdan foydalanishni namoyish qiling,
sinf NonGenDemo {
statik bo'shliq Main () {
NonGen iOb;
// NonGen sinf ob'ektini yaratish.
iOb = yangi NonGen (102);
// iOb o'zgaruvchisida saqlanadigan ma'lumot turini ko'rsating.
iOb.ShowType ();
// iOb o'zgaruvchisining qiymatini oling.
// Bu safar, kasting kerak,
int v = (int) iOb.GetOb ();
Console.WriteLine ("Qiymat:" + v);
Console.WriteLine ();
// NonGen va boshqa sinf ob'ektini yarating
// satrni u o'zgaruvchiga saqlang.
NonGen strOb = yangi NonGen ("Umumlashtirmaslik uchun sinov");
// strOb o'zgaruvchisida saqlanadigan ma'lumot turini ko'rsating.
strOb.ShowType ();
// strOb o'zgaruvchisining qiymatini oling.
// Bunday holda, kasting talab qilinadi.
Str str ((satr) strOb.GetOb ();
Console.WriteLine ("Qiymat:" + str);
// Ushbu kod kompilyatsiya qiladi, lekin u mutlaqo noto'g'ri!
iOb = strOb;
// Keyingi qator kodi istisno natijalarga olib keladi
// ish vaqtidagi vaziyatlar.
// v = (int) iOb.GetObO; // Bajarish paytida xato!
}
}
Ushbu dasturni bajarishda quyidagi natija olinadi.
O'zgaruvchan turi ob: System.Int32
Qiymat: 102
O'zgaruvchan turi ob: System.String
Qiymati: umumlashtirmaslik testi
Ko'rib turganingizdek, ushbu dasturning natijasi avvalgi dastur bilan bir xil.
Ushbu dasturda bir qator qiziqarli fikrlar e'tiborga loyiqdir. Birinchidan, T turi NonGen sinfida sodir bo'lgan joyda o'zgartiriladi. Shu sababli, ushbu sinfning umumlashtirilgan versiyasida bo'lgani kabi, har qanday turdagi ob'ekt NonGen sinfida saqlanishi mumkin. Ammo bu yondashuv ikki sababga ko'ra yaroqsiz. Birinchidan, saqlangan ma'lumotni olish aniq turdagi konversiyani talab qiladi. Ikkinchidan, dastur bajarilmaguncha ko'plab turdagi mos kelmaydigan xatolar aniqlanmaydi. Keling, ushbu sabablarning har birini batafsil ko'rib chiqaylik.
Keyingi kod satridan boshlaylik.
int v = (int) iOb.GetOb ();
Endi GetOb () usulining qaytish turi ob'ekti hisoblanadi, shuning uchun GetOb () usuli bilan qaytarilgan qiymatni olib tashlash va uni v o'zgaruvchisiga saqlash, int turiga aniq konversiya talab qilinadi. Agar turdagi translyatsiya chiqarib tashlansa, dastur tuzilmaydi. Ushbu dasturning umumlashtirilgan versiyasida tipni konversiya talab qilinmadi, chunki iOb ob'ektini yaratishda int turi argument sifatida ko'rsatilgan edi. Va ushbu dasturning umumlashtirilmagan versiyasida aniq turdagi konversiya talab qilindi. Ammo bu nafaqat noqulay, balki xatolarga ham olib keladi.
Dostları ilə paylaş: |