Mavzu: Umumlashgan delegatlar, interfeyslar. Reja


Download 61.5 Kb.
bet3/3
Sana05.05.2023
Hajmi61.5 Kb.
#1429507
1   2   3
Bog'liq
Umumlashgan delegatlar

T-tipli parametr nafaqat ByTwos sinfini e'lon qilishda, balki u ISeries interfeysini e'lon qilishda ham foydalanilgan. Va bu juda muhim. Axir, umumlashgan interfeysni versiyasini amalga oshiradigan sinfning o`zi ham umumlashgan bo`lishi kerak. Pastda ko`rsatilgan e`lon qilish usuli noto`g`ri, chunki birorta ham parameter T tipida aniqlanmagan.
class ByTwos : ISeries { // Noto`g`ri!
ISeries interfeysida aniqlangan argument tipini ByTwos sinfiga o'tkazilishi kerak. Aks holda, interfeys hech qanday argument tipini topa olmaydi.
Keyingi o'zgaruvchilar, keyingi ketma-ket joriy qiymatini(val) va uning boshlang'ich qiymati(start) saqlashda , umumlashgan T tipining ob'ektlari sifatida e'lon qilinadi. Shundan so'ng IncByTwo delegati e'lon qilgan. Ushbu delegat T tipdagi ob'ektda saqlangan qiymatni ikkiga oshirish uchun ishlatiladigan metod shaklini belgilaydi. ByTwos sinfi har qanday tipdagi ma'lumotlarni qayta ishlash tartibi qanday aniqlangan bo`lishiga qaramasdan har bir ma'lumotning qiymatini ikkiga oshirish nazarda tutilgan. Buning uchun ByTwos sinfining konstruktorlari qiymatni ikki barobar ko'payadigan metodga havola qilingan. Ushbu havola incr delegati o`zgaruvchisining nusxasini saqlanadi. Ketma-ketlikning keying elementi gneratsiya qilish jarayoni boshlanganda bu metod incr delegati yordamida chaqiriladi.
Endi ThreeD sinfiga e'tibor beraylik. Ushbu sinfda uch o'lchovli fazo (X,Z,Y) koordinatalari qamrab olinadi. Uning vazifasi ByTwos sinfida sinf ma'lumotlarini qayta ishlashni namoyish qilishdir.
Bundan tashqari, GenlntfDemo sinfida int, double va ThreeD kabi ob'ektlar qiymatini ikkiga oshiruvchi uchta metod e'lon qilingan. Ushbu metodlarning barchasi tegishli tipdagi ob'ektlarni yaratishda ByTwos sinfining konstruktoriga murojaat qiladi. Quyidagi ThreeDPlusTwo() metodiga alohida e'tibor beraylik.
// Metodda ThreeD tipidagi keying har bir ob'ekt koordinatalari qiymatini ikkiga //oshirish aniqlang.
static ThreeD ThreeDPlusTwo(ThreeD v) {
if (v == null) return new ThreeD(0, 0, 0);
else return new ThreeD(v.x + 2, v.у + 2, v.z + 2);
}
Ushbu metodda birinchi navbatda v o'zgaruvchi namunasini bo'sh qiymat (null)ga tekshiradi. Agar u bu qiymatni o'z ichiga olgan bo'lsa, metod ThreeD tipdagi ob'ektni yangi barcha koordinatalari nolga teng qiymatlar bilan qaytaradi. Aslida, v o'zgaruvchiga standart tipda berilgan default(T)qiymat ByTwos sinfning konstruktorida tayinlangan. Ushbu qiymat qiymatli tiplar uchun standart holda nolga teng bo'lib va ob'ektlarga havola(kursatgich) tiplari uchun bo'sh bo'ladi. Shuning uchun, agar SetStart() metodi oldindan chaqirilmagan bo'lsa, o'zgaruvchining qiymatini ikkiga oshirishdan oldin v ob'ektga havola bo'sh qiymat ega bo`ladi. Bu shuni anglatadiki, birinchi marta qiymatni ikki barobar oshirish uchun yangi ob'ekt talab qilinadi.
Umumlashgan interfeysdagi parametr tipiga ham umumlashgan sinfda bo'lgani kabi cheklovlar qo'llanilishi mumkin. Quyidagi misolda ISeries interfeysini e'lon qilishning faqat ko`rsatgich tiplarini ishlatish uchun cheklovlar variant keltirilgan.
public interface ISeries where T : class {
Agar ISeries interfeysining bunday versiyasi amalga oshirilsa, uni amalga oshiruvchi sinfda quyida ko'rsatilganidek, T tipidagi parametrga bir xil cheklovni ko'rsatilishi kerak.
class ByTwos : ISeries where T : class {
Malumot tipi cheklanganligi sababli, ISeries interfeysining ushbu versiyasi qiymat tiplariga qo'llanilishi mumkin emas. Shuning uchun, agar siz uni bu yerda ko'rib chiqilayotgan dastur misolida amalga oshirsangiz, faqat ByTwos e`lonini qabul qiladi, lekin ByTwos va ByTwose`lonlarini qabul qilmaydi.
Download 61.5 Kb.

Do'stlaringiz bilan baham:
1   2   3




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