Dastur musiqasi nima? Dastur musiqasining namunalari va ta'rifi. Umumlashtirish

C ++ tilining ob'ektga yo'naltirilgan komponentasi juda kuchli. C ++ tilida foydalanuvchi tomonidan aniqlangan ma'lumotlar turlarini amalga oshirishga imkon beradigan rivojlangan sinf apparati mavjud. O'rnatilgan operatorlarning foydalanuvchi tomonidan belgilangan turlari uchun haddan tashqari yuklanishi ushbu turlarga til uchun o'rnatilgan barcha imkoniyatlarni taqdim etishga imkon beradi. Bu C ++ o'rnatilgan tizimini kengaytiriladigan deb hisoblashga asos beradi.

C ++ klassi bu C tuzilmalarini umumlashtirishdir.Sinf C tuzilmalaridan ikki jihatdan farq qiladi. Birinchidan, sinf nafaqat ma'lumotlarni, balki funktsiyalarni ham birlashtiradi. Ikkinchidan, sinf a'zolariga kirish huquqi beriladi. Ma'lumotlar va funktsiyalarni birlashtirish ma'lumotlar va ular bilan bajarilishi kerak bo'lgan operatsiyalarni birlashtirishga imkon beradi Kirish huquqlari sinfning bajarilishini inkassatsiya qilishga (yashirishga) imkon beradi.

C ++ da foydalanuvchi tomonidan belgilangan turlarga merosxo'rlik va polimorfizm xususiyatlari berilishi mumkin. Bu dasturchiga ierarxik dasturiy ta'minot tizimlarini loyihalashtirishga imkon beradi.

1998 yilda tasdiqlangan, C ++ tili sintaksisini va uning standart kutubxonasini belgilaydigan standartning bo'lishi muhimdir.

E'tibor bering, ob'ektga yo'naltirilgan dasturlashda asosiy e'tibor protsessual dasturlashda bo'lgani kabi algoritmlarga emas, balki ma'lumotlarga qaratiladi.

Umumlashtirilgan dasturlash

Umumiy dasturlash funktsiya shablonlari va sinf shablonlari deb nomlanishga asoslangan. Bunday shablonlardan foydalanish ma'lumotni qayta ishlash algoritmlari ko'pincha ular qayta ishlanadigan ma'lumotlar turiga zaif bog'liqligi bilan bog'liq. Bunday holda, umumiy turlar deb ataladigan parametrlar orqali ishlov beriladigan ma'lumotlar turi haqida ma'lumot uzatish qulaydir. Ikki o'zgaruvchining qiymatlarini almashtirish uchun mo'ljallangan funktsiya shabloniga misol keltiramiz.

shablon bo'sh almashtirish (T & a, T & b) (T temp \u003d a; a \u003d b; b \u003d temp;) int main () (double x \u003d 2; double y \u003d 3; swap (x, y); printf (“x \u003d% 0.4gy \u003d% 0.4g \\ n ”, x, y); int n \u003d 4; int m \u003d 5; almashtirish (n, m); printf (“ n \u003d% dm \u003d% d \\ n ”, n, m); qaytish 0;)

Yuqoridagi kod swap () funktsiyasi uchun shablonni belgilash bilan boshlanadi. Funktsiya shabloni odatdagi funktsiya ta'rifidan ajratilgan so'z shablonidan boshlanadigan qo'shimcha prefiks bilan farq qiladi. Burchak qavslari shablon parametrlari ro'yxati deb ataladi. Ushbu misolda ushbu ro'yxat faqat bitta elementni o'z ichiga oladi, zaxira qilingan so'zlar sinfidan, shablon parametr T nomidan iborat. Zaxiralangan so'zlar sinfi shablon parametrining T umumiy tur ekanligini bildiradi (shablon parametrlarining boshqa turlari mavjud).

Qo'ng'iroq qilish funktsiyasida

Ob'ektga yo'naltirilgan dasturlash tomon

Ma'lumki, dasturlashning murakkabligi birinchi navbatda echilayotgan vazifalarning murakkabligi bilan bog'liq. Ushbu qiyinchiliklarni engib o'tishning asosiy usuli bu vazifani dekompozitsiya qilishdir. Parchalanish dastlabki masalani boshqa unchalik murakkab bo'lmagan masalalar to'plami bilan almashtirishdan iborat bo'lib, ularning birgalikdagi echimi kutilgan natijani berishi kerak.

Shuni yodda tutish kerakki, har bir parchalanish muvaffaqiyatga olib kelmaydi. Amalda, biz ko'pincha dasturning alohida subtaskalarni echish uchun mas'ul bo'lgan qismlari ishlaydigan vaziyatni hal qilishimiz kerak, ammo butun dastur umuman ishlamaydi. Bu dasturning alohida qismlari o'rtasida kuchli o'zaro bog'liqlik mavjud bo'lganda sodir bo'ladi.

Abstraktsiyadan foydalanish individual muammolarning echimini nisbatan mustaqil qilishga imkon beradi. Darhaqiqat, mavhumlik ma'lum bir hodisa, hodisa yoki ob'ektdagi muhim xususiyatlarni tanlash bilan bog'liq. Oxir oqibat, bu dasturning alohida tarkibiy qismlari o'rtasidagi munosabatlarni kamaytirishga yordam berishi kerak.

Dastlabki dasturlash tillarida harakat abstraktsiyasi yoki protsessual abstraktsiya deb ataladigan narsa o'z dasturini topdi. Amalning abstraktsiyasi subroutines (C tilining funktsiyalari) yordamida amalga oshiriladi.

Abstraktlarning ikkita asosiy turi mavjud:

    Harakatning mavhumligi (protsessual abstraktsiya).

    Ob'ektni mavhumlashtirish (ma'lumotlarning mavhum turi).

Amaliy abstraktsiya yoki protsessual abstraktsiya funktsiyalar apparati yordamida C ++ da amalga oshiriladi. Funksiyalardan foydalanib, dasturchi til tomonidan ta'minlanadigan ko'plab o'rnatilgan operatsiyalarni kengaytirish imkoniyatiga ega.

Protsessual dasturlashdan foydalanilganda, bu yagona qo'llab-quvvatlanadigan abstraktsiya. Action Abstraction tilini qo'llab-quvvatlovchi omillarni ko'rib chiqing:

    abstraktsiyani amalga oshirish uchun mo'ljallangan maxsus sintaktik tuzilmaning mavjudligi (funktsiyani aniqlash).

    interfeysni dasturdan ajratish qobiliyati.

    harakatni amalga oshiruvchi algoritmning amalga oshirilishini mijozdan yashirish.

Shaxsni abstraktsiya qilish ma'lumotlarning maxsus turlarini yaratish muammosi bilan chambarchas bog'liq. Haqiqat shundaki, amalda ko'pincha dastur ishlab chiqilayotgan predmet sohasida mavjud tushunchalarni modellashtirish zarurati paydo bo'ladi. Bu sizga maxsus ma'lumotlar turlarini yaratishga imkon beradigan qurilmaga ega bo'lish zarurligiga olib keladi. Quyidagi savolni ko'rib chiqish qiziq: S tilidagi mavjudotlarning abstraktsiyasini amalga oshirish mumkinmi yoki yo'qmi. Yuqorida aytib o'tilganlardan, harakatni mavhumlashtirishni amalga oshirishga urinishga salbiy ta'sir ko'rsatishi mumkin bo'lgan muhim faktni qayd etish mumkin: C tilida ushbu maqsadlar uchun mo'ljallangan sintaktik tuzilma mavjud emas.

Birinchidan, mavjudotlarning mavhumligini qanday tavsiflashingiz mumkinligi haqidagi juda muhim savolni ko'rib chiqamiz. Buning uchun zamonaviy dasturlashda tez-tez ishlatiladigan tushunchaga murojaat qilaylik. Bu mavhum ma'lumotlar turi.

Oxirgi yangilangan: 28.09.2017

2.0 versiyasi chiqarilishi bilan .NET ramkasi umumiy usullarni yaratish bilan bir qatorda generiklarni qo'llab-quvvatlashni boshladi. Ushbu hodisaning o'ziga xos xususiyatlarini tushunish uchun avval umumiy turlar paydo bo'lishidan oldin paydo bo'lishi mumkin bo'lgan muammoni ko'rib chiqamiz. Keling, bir misolni ko'rib chiqaylik. Aytaylik, biz bank hisob raqamini ko'rsatish uchun sinfni aniqladik. Masalan, shunday bo'lishi mumkin:

Sinf qaydnomasi (public int Id (get; set;) public int Sum (get; set;))

Hisob qaydnomasi klassi ikkita xususiyatni belgilaydi: Id - noyob identifikator va Sum - hisobdagi summa.

Bu erda identifikator raqamli qiymat sifatida o'rnatiladi, ya'ni bank hisobvaraqlari 1, 2, 3, 4 va boshqalarga ega bo'ladi. Shu bilan birga, identifikator uchun satr qiymatlarini ishlatish ham keng tarqalgan. Raqamli va mag'lubiyat qadriyatlarning ijobiy va salbiy tomonlari bor. Va sinfni yozish paytida biz identifikatorni saqlash uchun nimani tanlashni yaxshiroq bilmasligimiz mumkin - satr yoki raqam. Yoki, ehtimol ushbu sinf ushbu masala bo'yicha o'z fikriga ega bo'lgan boshqa ishlab chiquvchilar tomonidan ishlatilishi mumkin.

Va birinchi qarashda, ushbu vaziyatdan chiqish uchun Id xususiyatini tip ob'ektining xususiyati sifatida aniqlashimiz mumkin. Ob'ekt turi navbati bilan barcha turlar meros bo'lib o'tadigan universal tip bo'lgani uchun biz ikkala satrni ham, raqamlarni ham shu turdagi xususiyatlarda saqlashimiz mumkin:

Sinf qayd yozuvi (umumiy ob'ekt identifikatori (get; set;) public int Sum (get; set;))

Keyinchalik ushbu sinf dasturda bank hisobvaraqlarini yaratish uchun ishlatilishi mumkin:

Hisob qaydnomasi1 \u003d yangi Hisob (Sum \u003d 5000); Hisob qaydnomasi2 \u003d yangi hisob (Sum \u003d 4000); hisob 1. ID \u003d 2; account2.Id \u003d "4356"; int id1 \u003d (int) hisob 1. ID; string id2 \u003d (string) account2.Id; Console.WriteLine (id1); Console.WriteLine (id2);

Har bir narsa juda yaxshi ishlaydi, ammo bu echim juda maqbul emas. Haqiqat shundaki, bu holda biz boks va kabi hodisalarga duch kelamiz qutidan chiqarish.

Shunday qilib, Id xususiyatiga int tipidagi qiymatni tayinlashda ushbu qiymat Object turiga to'planadi:

Account1.Id \u003d 2; // ob'ekt qiymatiga int qiymatlariga boks

Ma'lumotlarni int turidagi o'zgaruvchiga qaytarish uchun quyidagilarni ochishingiz kerak:

Int id1 \u003d (int) hisob 1. ID; // int turiga ochish

Boks qiymat turidagi ob'ektni (int kabi) ob'ekt turiga o'zgartirishni o'z ichiga oladi. Paketlashda umumiy CLR tili qiymatni System.Object tipidagi ob'ektga o'raladi va uni boshqariladigan uyumda saqlaydi. Boshqa tomondan, quti qutisidan chiqarish turi ob'ekt ob'ektini konvertatsiya qilishni o'z ichiga oladi muhim turi... Qadoqlash va ochish ish faoliyatini pasaytiradi, chunki tizim kerakli o'zgarishlarni amalga oshirishi kerak.

Bundan tashqari, yana bir muammo bor - turlarning xavfsizligi muammosi. Shunday qilib, agar biz shunday yozsak, ish vaqtida xatolikka yo'l qo'yamiz:

Hisob qaydnomasi2 \u003d yangi Hisob (Sum \u003d 4000); account2.Id \u003d "4356"; int id2 \u003d (int) hisob 2. Id; // Istisno InvalidCastException

Id qaysi ob'ektni anglatishini bilmasligimiz mumkin va bu holda raqamni olishga harakat qilsak, InvalidCastException bilan uchrashamiz.

Ushbu muammolar umumiy turlarni yo'q qilishga qaratilgan edi. Umumiy turlar sizga foydalaniladigan ma'lum bir turni ko'rsatishga imkon beradi. Shuning uchun, Hisob sinfini umumiy deb belgilaylik:

Sinf hisobi (public T Id (get; set;) public int Sum (get; set;))

Sinfdagi burchakli qavslar Hisob ta'rifi sinf umumiy ekanligini va burchakli qavs ichiga olingan T tipi shu sinf tomonidan ishlatilishini ko'rsating. T harfini ishlatish shart emas, u boshqa har qanday harf yoki belgilar to'plami bo'lishi mumkin. Va endi biz uning qaysi turi bo'lishini bilmaymiz, har qanday tur bo'lishi mumkin. Shuning uchun, burchakli qavsdagi T parametri ham deyiladi universal parametr, chunki uning o'rniga har qanday turni almashtirish mumkin.

Masalan, T parametri o'rniga int ob'ektidan, ya'ni hisob raqamini ko'rsatadigan raqamdan foydalanishingiz mumkin. Bu shuningdek mag'lubiyat ob'ekti yoki boshqa har qanday sinf yoki tuzilma bo'lishi mumkin:

Hisob qaydnomasi account1 \u003d yangi hisob (Sum \u003d 5000); Hisob qaydnomasi account2 \u003d yangi hisob (Sum \u003d 4000); hisob 1. ID \u003d 2; // qadoqlash shart emas schyot2.Id \u003d "4356"; int id1 \u003d hisob 1. ID; // paketdan chiqarishga hojat yo'q string id2 \u003d account2.Id; Console.WriteLine (id1); Console.WriteLine (id2);

Hisob klassi umumiy bo'lganligi sababli, burchak nomidagi qavsda tur nomidan keyin o'zgaruvchini belgilashda siz T universal parametri o'rniga foydalaniladigan turni belgilashingiz kerak. Bunday holda, hisob ob'ektlari int va string turlari bilan yoziladi:

Hisob qaydnomasi account1 \u003d yangi hisob (Sum \u003d 5000); Hisob qaydnomasi account2 \u003d yangi hisob (Sum \u003d 4000);

Shuning uchun birinchi account1 ob'ekti int tipidagi Id xususiyatiga, account2 ob'ekti esa satr turiga ega.

Agar biz Id xususiyatining qiymatini boshqa turdagi o'zgaruvchiga berishga harakat qilsak, biz kompilyatsiya xatosiga duch kelamiz:

Hisob qaydnomasi account2 \u003d yangi hisob (Sum \u003d 4000); account2.Id \u003d "4356"; int id1 \u003d hisob 2. Id; // kompilyatsiya xatosi

Bu turdagi xavfsizlik muammolarini oldini oladi. Shunday qilib, sinfning umumiy versiyasidan foydalanib, biz bajarilish vaqtini va yuzaga kelishi mumkin bo'lgan xatolar sonini kamaytiramiz.

Standart qiymatlar

Ba'zan umumiy parametrlarning o'zgaruvchilariga ba'zi bir boshlang'ich qiymatlarni berish kerak bo'ladi, shu jumladan null. Ammo biz uni to'g'ridan-to'g'ri tayinlay olmaymiz:

T id \u003d null;

Bunday holda biz standart (T) iboradan foydalanishimiz kerak. U mos yozuvlar turlariga null va qiymat turlariga 0 belgilaydi:

Sinf hisobi (T id \u003d standart (T);)

Umumiy sinfning statik maydonlari

Umumiy sinfni ma'lum bir turga kiritishda uning statik a'zolar to'plami yaratiladi. Masalan, Account klassi quyidagi statik maydonni belgilaydi:

Sinf hisobi (public static T sessiyasi; public T Id (get; set;) public int Sum (get; set;))

Endi biz sinfni ikkita turdagi int va string bilan yozamiz:

Hisob qaydnomasi account1 \u003d yangi hisob (Sum \u003d 5000); Hisob qaydnomasi .sessiya \u003d 5436; Hisob qaydnomasi account2 \u003d yangi hisob (Sum \u003d 4000); Hisob qaydnomasi .sessiya \u003d "45245"; Console.WriteLine (Hisob qaydnomasi .sessiya); // 5436 Console.WriteLine (Hisob qaydnomasi .sessiya); // 45245

Natijada, Hisob uchun va Hisob uchun o'z sessiyasining o'zgaruvchisi yaratiladi.

Bir nechta umumiy parametrlardan foydalanish

Generika bir vaqtning o'zida bir nechta umumiy parametrlardan foydalanishi mumkin, ular har xil turlarni ifodalashi mumkin:

Sinf operatsiyasi (public U FromAccount (get; set;) // qaysi hisobdan o'tkazma umumiy hisoblanadi U ToAccount (get; set;) // qaysi hisob raqamiga o'tkazilgan public V Code (get; set;) // operatsion kod public int Sum (get; set; belgilangan;) // transfer summasi)

Transaction klassi bu erda ikkita umumiy parametrdan foydalanadi. Keling, ushbu sinfni qo'llaymiz:

Hisob qaydnomasi acc1 \u003d yangi hisob (Id \u003d 1857, Sum \u003d 4500); Hisob qaydnomasi acc2 \u003d yangi hisob (Id \u003d 3453, Sum \u003d 5000); Tranzaksiya , string \u003eaction1 \u003d yangi Transaction , string\u003e (FromAccount \u003d acc1, ToAccount \u003d acc2, Code \u003d "45478758", Sum \u003d 900);

Bu erda Transaction ob'ekti Account turlari bilan yoziladi va mag'lubiyat. Ya'ni, Account klassi U universal parametri sifatida ishlatiladi. , va V parametri uchun tip qatori. Shu bilan birga, siz ko'rib turganingizdek, Transaction yoziladigan sinf o'zi umumiydir.

Umumlashtirilgan usullar

Umumiy sinflardan tashqari, umumiy parametrlarni xuddi shu tarzda ishlatadigan umumiy usullarni ham yaratishingiz mumkin. Masalan:

Sinf dasturi (xususiy statik bo'sh joy (string args) (int x \u003d 7; int y \u003d 25; almashtirish) (ref x, ref y); Console.WriteLine ($ "x \u003d (x) y \u003d (y)"); // x \u003d 25 y \u003d 7 qator s1 \u003d "salom"; string s2 \u003d "xayr"; Almashtirish (ref s1, ref s2); Console.WriteLine ($ "s1 \u003d (s1) s2 \u003d (s2)"); // s1 \u003d xayr s2 \u003d salom Console.Read (); ) umumiy statik bo'shliqni almashtirish (ref T x, ref T y) (T temp \u003d x; x \u003d y; y \u003d temp;))

Bu parametrlarni mos yozuvlar asosida qabul qiladigan va ularning qiymatlarini o'zgartiradigan umumiy almashtirish usulini belgilaydi. Bunday holda, ushbu parametrlarning qaysi turini anglatishi muhim emas.

Asosiy usulda biz almashtirish usulini chaqiramiz, uni ma'lum bir tip bilan yozamiz va unga bir nechta qiymatlarni beramiz.

Keyin parametrli polimorfizm shaklida va uning avlodlari, keyin C ++, Java, Object Pascal ,, Eyfel kabi ko'plab ob'ektga yo'naltirilgan tillarda .NET platformasi uchun tillar va boshqalar.

Umumiy dasturlash metodologiyasi

Umumlashtirilgan dasturlash talablarning mavhum tavsiflaridan foydalanish orqali ma'lumotlar tuzilmalari va algoritmlarini ajratishga asoslangan dasturlash metodologiyasi sifatida qaraladi. Abstrakt talablarning tavsiflari mavhum ma'lumotlar turi kontseptsiyasining kengaytmasi. Alohida turni tavsiflash o'rniga umumiy dasturlash umumiy interfeysga va semantik xulq-atvorga ega bo'lgan turkumlar oilasining tavsifidan foydalanadi. Interfeysni va semantik xatti-harakatni tavsiflovchi talablar to'plami deyiladi kontseptsiya (inglizcha tushuncha). Shunday qilib, umumiy uslubda yozilgan algoritm uning tushunchalarini qondiradigan har qanday turga qo'llanilishi mumkin. Ushbu imkoniyat deyiladi polimorfizm.

Ular turi deyishadi taqlid qiladi kontseptsiya (kontseptsiyaning modeli), agar u o'z talablarini qondirsa. Kontseptsiya tushuntirish ikkinchisini to'ldiradigan bo'lsa, boshqa tushuncha. Kontseptsiya talablari quyidagi ma'lumotlarni o'z ichiga oladi:

  • To'g'ri iboralar (Inglizcha tegishli iboralar) - kontseptsiyani modellashtiradigan turlar uchun muvaffaqiyatli tuzilishi kerak bo'lgan dasturlash tilidagi iboralar.
  • Birlashtirilgan turlar Birlashtirilgan turlar - bu tushunchani simulyatsiya qiladigan turga bog'liq bo'lgan yordamchi turlar.
  • Invariants (Inglizcha invariantlar) - bajarilish paytida doimo to'g'ri bo'lishi kerak bo'lgan turlarning bunday xususiyatlari. Odatda old shartlar va keyingi shartlar sifatida ifodalanadi. Old shartni bajarmaganlik tegishli operatsiyani oldindan aytib bo'lmasligiga olib keladi va xatolarga olib kelishi mumkin.
  • Murakkablik kafolatlari (murakkablik kafolatlari) - haqiqiy ifodaning maksimal bajarilish vaqti yoki maksimal talablar ushbu iborani bajarish paytida turli xil manbalarga.

Qo'ng'iroq qilish mumkin bo'lgan umumiy dasturlashni aniqlashga muqobil yondashuv umumiy ma'lumotlar turini dasturlash (ing. Datatype generic software), Richard Bird va Lambert Meertens tomonidan taklif qilingan. Unda ma'lumotlar tipidagi tuzilmalar umumiy dasturlarning parametrlari hisoblanadi. Buning uchun dasturlash tili kiritiladi yangi daraja mavhumlashtirish, ya'ni o'zgaruvchan imzoga ega algebra sinflariga nisbatan parametrlash. Garchi har ikkala yondashuv nazariyalari dasturlash tilidan mustaqil bo'lsa-da, kontseptsiya tahlilini ta'kidlaydigan Masser-Stepanov yondashuvi C ++ ni o'zining asosiy platformasiga aylantirdi, ma'lumotlar turlarini umumiy dasturlashda deyarli faqat Haskell va uning variantlari qo'llaniladi.

Umumiy mexanizm

Umumiy dasturlash vositalari dasturlash tillarida ma`lumotlar (ma'lumotlar turlari) va ma'lumotlar turlari bo'yicha parametrlangan algoritmlarni (protseduralar, funktsiyalar, usullar) tavsiflashga imkon beradigan ma'lum sintaktik vositalar ko'rinishida amalga oshiriladi. Funktsiya yoki ma'lumotlar turi rasmiy turdagi parametrlarni aniq e'lon qiladi. Ushbu tavsif umumlashtirilgan va to'g'ridan-to'g'ri asl shaklida ishlatilishi mumkin emas.

Umumiy tip yoki funktsiya ishlatiladigan dasturning o'sha joylarida dasturchi tavsifni o'rnatadigan haqiqiy turdagi parametrni aniq ko'rsatishi kerak. Masalan, ikkita qiymatni almashtirishning umumiy protsedurasida u o'zgartiradigan qiymatlar turini belgilaydigan tip parametri bo'lishi mumkin. Dasturchiga ikkita tamsayı qiymatini almashtirish zarur bo'lganda, u protsedurani "integer" tipidagi parametr va ikkita parametr - tamsayı, ikkita satr - "string" parametri va ikkita parametr - satr bilan chaqiradi. Ma'lumotlarga nisbatan dasturchi, masalan, ro'yxatda saqlanadigan qiymatlar turini belgilaydigan tip parametri bilan umumiy "ro'yxat" turini tavsiflashi mumkin. Keyinchalik, haqiqiy ro'yxatlarni tavsiflashda dasturchi umumiy tip va tip parametrlarini ko'rsatishi kerak, shu bilan bir xil tavsif yordamida istalgan ro'yxatni olishi kerak.

Tuzuvchi umumiy turga yoki funktsiyaga qo'ng'iroqqa duch kelganda, u statik tipni tekshirishning zarur protseduralarini bajaradi, berilgan instansiya imkoniyatini baholaydi va ijobiy bo'lsa, umumiy tavsifdagi rasmiy tip parametri o'rniga haqiqiy tip parametrini almashtirish bilan kod hosil qiladi. Tabiiyki, umumiy tavsiflardan muvaffaqiyatli foydalanish uchun haqiqiy parametr turlari ma'lum shartlarni qondirishi kerak. Agar umumiy funktsiya parametr turidagi qiymatlarni taqqoslasa, unda ishlatiladigan har qanday aniq turdagi taqqoslash operatsiyalarini qo'llab-quvvatlashi kerak; agar parametr turidagi qiymatlarni o'zgaruvchilarga beradigan bo'lsa, ma'lum bir tur to'g'ri tayinlashni ta'minlashi kerak.

Tillarda umumlashtirilgan dasturlash

C ++

C ++ tilida umumiy dasturlash "naqsh" tushunchasiga asoslanadi kalit so'z shablon... Keng qo'llanilgan standart kutubxona C ++ (STL-ga qarang), shuningdek, Loki kutubxonalarini kuchaytirish. Aleksandr Stepanov C ++ da rivojlangan umumiy dasturlash vositalarining paydo bo'lishiga katta hissa qo'shdi.

Misol tariqasida, qaytib keladigan funktsiyaning shablonini (umumlashtirish) keltiramiz katta ahamiyatga ega ikkitadan.

// Funktsiya shablonining tavsifi shablon< typename T > T max (T x, T y) (agar (x.)< y ) return y ; else return x ; } ... // Shablon tomonidan ko'rsatilgan funktsiyani qo'llash int a \u003d max (10, 15); ... ikkilangan f \u003d max (123.11, 123.12); ...

yoki bog'langan ro'yxat sinfining shablonini (umumlashtirish):

shablon< class T > class List (/ * ... * / public: void Add (const T & Element); bool Find (const T & Element); / * ... * /);

Java

Java, J2SE 5.0 dan beri C ++ asosida sintaktik ravishda umumiy dasturlash vositalarini taqdim etdi. Ushbu tilda mavjud umumiy narsalar yoki "T tipidagi konteynerlar" umumiy dasturlashning bir qismidir.

.NET

// http://digitalmars.com/d/2.0/template.html andoza Foo (T, R ...) // T - tip, R - turlar to'plami (bekor Foo (T t, R r) (writeln (t); statik agar (r. uzunlik) // ko'proq argumentlar bo'lsa Foo (r)); // qolgan argumentlarni bajaring )) void main () (Foo (1, "a", 6.8);) / +++++++++++++++ nashrlari: 1 a 6.8 ++++++++++ +++++ /

Umumiy dasturlash vositalari dasturlash tillarida ma`lumotlar (ma'lumotlar turlari) va ma'lumotlar turlari bo'yicha parametrlangan algoritmlarni (protseduralar, funktsiyalar, usullar) tavsiflashga imkon beradigan ma'lum sintaktik vositalar ko'rinishida amalga oshiriladi. Funktsiya yoki ma'lumotlar turi rasmiy turdagi parametrlarni aniq e'lon qiladi. Ushbu tavsif umumlashtirilgan va to'g'ridan-to'g'ri asl shaklida ishlatilishi mumkin emas.

Umumiy tip yoki funktsiya ishlatilgan dasturning o'sha joylarida dasturchi tavsifni ko'rsatadigan haqiqiy turdagi parametrni aniq ko'rsatishi kerak. Masalan, ikkita qiymatni almashtirishning umumiy protsedurasida u o'zgartiradigan qiymatlar turini belgilaydigan tip parametri bo'lishi mumkin. Dasturchiga ikkita tamsayı qiymatini almashtirish zarur bo'lganda, u protsedurani "integer" tipidagi parametr va ikkita parametr - tamsayı, ikkita satr - "string" parametri va ikkita parametr - satr bilan chaqiradi. Ma'lumotlar misolida dasturchi, masalan, ro'yxatda saqlanadigan qiymatlar turini belgilaydigan tip parametri bilan umumiy "ro'yxat" turini tavsiflashi mumkin. Keyinchalik, haqiqiy ro'yxatlarni tavsiflashda dasturchi umumiy tur va tip parametrlarini ko'rsatishi kerak, shu bilan bir xil tavsif yordamida istalgan istalgan ro'yxatni oladi.

Tuzuvchi umumiy turga yoki funktsiyaga qo'ng'iroqqa duch kelganda, u statik tipni tekshirishning zarur protseduralarini bajaradi, berilgan instansiya imkoniyatini baholaydi va ijobiy bo'lsa, umumiy tavsifdagi rasmiy tip parametri o'rniga haqiqiy tip parametrini almashtirish bilan kod hosil qiladi. Tabiiyki, umumiy tavsiflardan muvaffaqiyatli foydalanish uchun haqiqiy parametr turlari ma'lum shartlarni qondirishi kerak. Agar umumiy funktsiya parametr turidagi qiymatlarni taqqoslasa, unda ishlatiladigan har qanday aniq turdagi taqqoslash operatsiyalarini qo'llab-quvvatlashi kerak; agar parametr turidagi qiymatlarni o'zgaruvchilarga beradigan bo'lsa, ma'lum bir tur to'g'ri tayinlashni ta'minlashi kerak.

Amalga oshirish usullari

Kompilyatorda umumiy dasturiy ta'minotni amalga oshirishning ikkita asosiy usuli mavjud.

  • Har bir misol uchun yangi kod yaratilmoqda. Bunday holda, kompilyator umumiy tavsifni instansiyalarni yaratish uchun matnli shablon sifatida ko'rib chiqadi. Agar kompilyatorga umumiy tip yoki protseduraning yangi instantatsiyasi kerak bo'lganda, unga tip parametrini mexanik ravishda qo'shish orqali turdagi yoki protseduraning yangi nusxasini yaratadi. Ya'ni, elementlarni almashtirish uchun umumlashtirilgan funktsiyaga ega bo'lgan holda, kompilyator butun sonli chaqiriqqa duch kelganda, tamsayılarni almashtirish funktsiyasini yaratadi va uning chaqiruvini kodga almashtiradi, so'ngra mag'lubiyat turi uchun chaqirig'iga duch kelganda, birinchisiga hech qanday aloqasi bo'lmagan satrlarni almashtirish funktsiyasini yaratadi. Ushbu usul maksimal ishlashni ta'minlaydi, chunki dasturlar dasturning turli qismlariga aylanadi, shuning uchun ularning har biri o'z parametr turiga moslashtirilishi mumkin va bundan tashqari, yo'q qo'shimcha elementlarishlash vaqtida turlarni tekshirish yoki konvertatsiya qilish bilan bog'liq. Uning kamchiliklari shundaki, har xil turdagi parametrlarga ega bo'lgan umumiy turlardan va funktsiyalardan faol foydalanilganda, tuzilgan dastur hajmi juda ko'payishi mumkin, chunki bu tavsif uchun ham turli xil turlari farq qilmang, kompilyator baribir alohida kod ishlab chiqaradi. Ushbu kamchilik umumiy kodning qisman hosil bo'lishi bilan yashirilishi mumkin (umumlashtirilgan tavsifning parametr turlariga bog'liq bo'lmagan qismi maxsus tarzda formatlanadi va kompilyator undan barcha misollar uchun bitta kod hosil qiladi). Ammo ushbu mexanizm ba'zi bir parametr turlari uchun umumiy turlar va funktsiyalarning maxsus (odatda - qo'lda optimallashtirilgan) instansiyalarini yaratish uchun tabiiy imkoniyat yaratadi.
  • Ishlash vaqtida haqiqiy parametr parametrlarini o'zi ishlaydigan bitta turga o'zgartiradigan kodni yaratish. Bunday holda, dasturni tuzish bosqichida kompilyator faqat turlarning muvofiqligini tekshiradi va ma'lum bir turdagi parametrni konvertatsiya qilish uchun buyruq kodiga kiritadi umumiy turi... Umumiy tip yoki funktsiyalarning ishlashini belgilaydigan kod kompilyatsiya qilingan dasturda bitta nusxada mavjud bo'lib, konversiya va tur tekshiruvlari dastur ishlayotganda dinamik ravishda amalga oshiriladi. Ushbu versiyada, qoida tariqasida, ixchamroq kod ishlab chiqariladi, ammo qo'shimcha operatsiyalarni bajarish zaruriyati va kamroq optimallashtirish imkoniyatlari tufayli dastur birinchi versiyaga qaraganda o'rtacha sekinroq bo'lib chiqadi. Bundan tashqari, turlar haqidagi dinamik ma'lumotlar har doim ham parametr turlari uchun tuzilgan kodga kiritilmaydi (birinchi versiyada, agar u umuman qo'llab-quvvatlansa, chunki har bir parametr turi uchun instansiyalar har xil), bu umumiy turlar va funktsiyalardan foydalanishga oid ba'zi cheklovlarni belgilaydi. Shu kabi cheklovlar mavjud, masalan, Java-da.

Tillarda umumlashtirilgan dasturlash

C ++

C ++ da umumiy dasturlash kalit so'z bilan belgilangan "shablon" tushunchasiga asoslangan shablon... U C ++ standart kutubxonasida (STL-ga qarang), shuningdek, uchinchi tomon boost kutubxonalarida, Aleksandr Stepanovda keng qo'llaniladi.

Misol tariqasida, bu ikkitaning katta qiymatini qaytaradigan umumiy funktsiya.

// Shablon funktsiyasining tavsifi shablon T max (T x, T y) (agar (x.)< y) return y; else return x; } ... // Andoza funktsiyasini qo'llang int a \u003d max (10, 15); ... ikkilangan f \u003d max (123.11, 123.12); ...

Java

Java, J2SE 5.0 dan beri C ++ asosida sintaktik ravishda umumiy dasturlash vositalarini taqdim etdi. Ushbu tilda mavjud umumiy narsalar yoki "T tipidagi konteynerlar" umumiy dasturlashning bir qismidir.

.NET

Misol

D.

D tilida umumiy dasturlash vositalari C ++ da sezilarli darajada rivojlanib, protsessual va ob'ektga yo'naltirilgan. Lingvistik vakillik ham ancha soddalashgan.

D andozalari asosida rekursiv avlodga misol:

// http://digitalmars.com/d/2.0/template.html andoza Foo (T, R ...) // T - tip, R - turlar to'plami (bekor Foo (T t, R r) (writefln (t); statik if (r.length) // ko'proq argumentlar bo'lsa Foo (r); // qolgan argumentlarni bajaring )) void main () (Foo (1, "a", 6.8);) / +++++++++++++++ nashrlari: 1 a 6.8 ++++++++++ +++++ /


Vikimedia fondi. 2010 yil.

Boshqa dasturiy lug'atlarda "Umumlashtirilgan dasturlash" nima ekanligini ko'ring:

    umumiy dasturlash - - [E.S. Alekseev, A.A. Myachev. Inglizcha ruscha izohli lug'at kompyuter tizimlari muhandisligi bo'yicha. Moskva 1993 yil] Mavzular axborot texnologiyalari umuman EN umumlashtirilgan dasturlashGP ... Texnik tarjimon uchun qo'llanma

    Zamonaviy C ++ dizayni

    Ushbu maqola vikipediya qilinishi kerak. Iltimos, maqolani formatlash qoidalariga muvofiq to'ldiring. Konventsiyalar ... Vikipediya

    Ushbu atama boshqa ma'nolarni ham anglatadi, qarang. C. Shuningdek qarang: C (dasturlash tili) C ++ semantikasi: multiparadigma: ob'ektga yo'naltirilgan, umumiy, protsessual, metaprogramma Ijro turi: tuzilgan ... Vikipediyada

    Ushbu atama boshqa ma'nolarga ega, qarang D. D Semantika: multiparadigma: imperativ, ob'ektga yo'naltirilgan, umumiy dasturlash Ijro etilish turi: kompilyator Kirish: 1999 yil Muallif (lar) ... Vikipediya

    Shuningdek qarang: C (dasturlash tili) C ++ semantikasi: multiparadigma: ob'ektga yo'naltirilgan, umumlashtirilgan, protsessual, metaprogramma Ijro etilish turi: tuzilgan Kiritilgan: 1985 yil Muallif (lar): Björn Stroustrup ... Vikipediya

    Ushbu atama boshqa ma'nolarga ega, qarang F (ma'nolari). To'g'ri sarlavha ushbu F # maqolasining. Texnik cheklovlar tufayli noto'g'ri ko'rsatilgan. F # Til sinfi: ko'p paradigma: funktsional, ob'ektga yo'naltirilgan, ... ... Vikipediya

    Belgilarning bu birikmasi ko'pincha F akkordda yoki tugmachani bildiradi F Fors katta F♯ funktsional dasturlash tili hisoblanadi umumiy maqsad... Kembrijdagi Microsoft Research kompaniyasida Don Syme tomonidan ishlab chiqilgan. F♯ tuzilishi asosan ... ... Vikipediya

    F # umumiy maqsadli funktsional dasturlash tili. Kembrijdagi Microsoft Research kompaniyasida Don Syme tomonidan ishlab chiqilgan. F # ning tuzilishi .NET kutubxonalari tuzilishiga va ish vaqtiga juda o'xshaydi. Ba'zi muammolar hal qilindi ... ... Vikipediya

    Ushbu atama boshqa ma'nolarga ega, qarang Loki (ma'nosizlantirish). C ++ dasturlash tili uchun Loki kutubxonasi Andrey Aleksandresku tomonidan "Zamonaviy C ++ Dizayn: Umumlashtirilgan dasturlash va dastur namunalari" kitobining bir qismi sifatida yozilgan ... Vikipediya

Kitoblar

  • Dasturlash. C ++, Stroustrup Bjarne foydalanish printsiplari va amaliyoti. Ushbu kitob C ++ tilidagi darslik emas, bu dasturlash bo'yicha darslik. Uning muallifi C ++ tilining muallifi bo'lishiga qaramay, kitob ushbu dasturlash tiliga bag'ishlanmagan; u ... da o'ynaydi

Umumiy dasturlash Umumiy dasturlash - bu har xil turdagi ob'ektlar bilan qayta ishlatilishi mumkin bo'lgan kod yozish.

Java-ning dastlabki versiyalarida bu meros orqali amalga oshirildi, ArrayList qator Ob'ekt havolalarini o'z ichiga olgan. Qachonki qiymat olingan bo'lsa, gips ijro etilishi kerak edi.

Umumlashtirilgan dasturlash - bu ma'lumotlar va algoritmlarni qo'llanilishi mumkin bo'lgan tarzda tavsiflovchi dasturlash paradigmasi turli xil turlari tavsifni o'zi o'zgartirmasdan ma'lumotlar. Uni turli xil dasturlash tillari u yoki bu shaklda qo'llab-quvvatlaydi.

Generika tildagi eng muhim o'zgarishlarni anglatadi java dasturlash 1.0 versiyasidan beri. Java 5.0-ga generic-larning kiritilishi 1999 yilda ishlab chiqilgan birinchi Java Spetsifikatsiya Talablari (JSR 14) natijasidir. Generics kerak edi, chunki ular sizga ob'ekt o'zgaruvchilari bilan haddan tashqari yuklangan kodga qaraganda xavfsizroq o'qish osonroq kod yozishga imkon beradi. va gips turi. Generics, har joyda mavjud bo'lgan ArrayList kabi yig'ish darslari uchun ayniqsa foydalidir.

Generika C ++ tilidagi shablonlarga o'xshash - hech bo'lmaganda yuzaki -. Java-da bo'lgani kabi C ++ da ham shablonlar birinchi navbatda kuchli terilgan to'plamlarni qo'llab-quvvatlash uchun qo'shildi. Biroq, yillar davomida boshqa dasturlar topildi.

Dasturlashning umumiy imkoniyatlari dastlab 70-yillarda CLU va Ada tillarida, so'ngra C ++, Java, D kabi ko'plab ob'ektga yo'naltirilgan tillarda va .NET platformasi uchun tillarda paydo bo'ldi. Umumiy mexanizm Umumiy dasturlash vositalari ma'lum sintaktik vositalar shaklida amalga oshiriladi. Funktsiya yoki ma'lumotlar turi rasmiy turdagi parametrlarni aniq e'lon qiladi. Ushbu tavsif umumlashtirilgan va to'g'ridan-to'g'ri asl shaklida ishlatilishi mumkin emas.

Umumiy tip yoki funktsiya ishlatilgan dasturning o'sha joylarida dasturchi tavsifni ko'rsatadigan haqiqiy turdagi parametrni aniq ko'rsatishi kerak. Tuzuvchi umumiy tipga yoki funktsiyaga qo'ng'iroqqa duch kelganda, statik tipni tekshirish uchun zarur bo'lgan protseduralarni bajaradi, berilgan instansiya imkoniyatini baholaydi va ijobiy bo'lsa, umumiy tavsifdagi rasmiy tip parametr o'rniga haqiqiy tip parametrni o'rniga kodni hosil qiladi.

Tabiiyki, umumiy tavsiflardan muvaffaqiyatli foydalanish uchun haqiqiy parametr turlari ma'lum shartlarni qondirishi kerak. Agar umumiy funktsiya parametr turidagi qiymatlarni taqqoslasa, unda ishlatiladigan har qanday aniq tur taqqoslash operatsiyalarini qo'llab-quvvatlashi kerak; agar parametr turidagi qiymatlarni o'zgaruvchilarga beradigan bo'lsa, ma'lum bir tur to'g'ri tayinlashni ta'minlashi kerak. Amalga oshirish usullari Kompilyatorda umumiy dasturiy ta'minotni amalga oshirishning ikkita asosiy usuli mavjud.

Har bir misol uchun yangi kod yaratilmoqda. Bunday holda, kompilyator umumiy tavsifni instansiyalarni yaratish uchun matnli shablon sifatida ko'rib chiqadi. Agar kompilyatorga umumiy tip yoki protseduraning yangi instansiyasi kerak bo'lganda, unga tip parametrini mexanik ravishda qo'shish orqali turdagi yoki protseduraning yangi nusxasini yaratadi. Ya'ni, elementlarni almashtirish uchun umumlashtirilgan funktsiyaga ega bo'lgan holda, kompilyator butun sonli chaqiriqqa duch kelganda, tamsayılarni almashtirish funktsiyasini yaratadi va uning chaqiruvini kodga almashtiradi, so'ngra mag'lubiyat turi uchun chaqirig'iga duch kelganda, birinchisiga hech qanday aloqasi bo'lmagan satrlarni almashtirish funktsiyasini yaratadi. Ushbu usul maksimal ishlashni ta'minlaydi. Uning kamchiligi shundaki, har xil tipdagi parametrlarga ega bo'lgan umumiy turlardan va funktsiyalardan faol foydalanishda kompilyatsiya qilingan dastur hajmi juda kattalashishi mumkin, chunki har xil turlari uchun farq qilmaydigan tavsif fragmentlari uchun ham kompilyator hanuzgacha alohida kod ishlab chiqaradi. Ushbu kamchilik umumiy kodning qisman hosil bo'lishi bilan yashirilishi mumkin (parametr turlariga bog'liq bo'lmagan umumlashtirilgan tavsifning qismi maxsus tarzda formatlangan va kompilyator unga asoslangan barcha instansiyalar uchun bitta kod ishlab chiqaradi). ... Ishlash vaqtida haqiqiy parametr parametrlarini o'zi ishlaydigan bitta turga o'zgartiradigan kodni yaratish. Bunday holda, dasturni tuzish bosqichida kompilyator faqat turlarning muvofiqligini tekshiradi va ma'lum bir tip-parametrni umumiy turga o'tkazish buyruq kodiga kiradi. Umumiy tip yoki funktsiyalarning ishlashini belgilovchi kod kompilyatsiya qilingan dasturda bitta nusxada mavjud bo'lib, konversiya va tip tekshiruvlari dastur ishlayotganda dinamik ravishda amalga oshiriladi. Ushbu versiyada, qoida tariqasida, ixchamroq kod ishlab chiqariladi, ammo qo'shimcha operatsiyalarni bajarish zaruriyati va kamroq optimallashtirish imkoniyatlari tufayli dastur birinchi versiyaga qaraganda o'rtacha sekinroq bo'lib chiqadi. Bundan tashqari, turlar haqidagi dinamik ma'lumotlar har doim ham parametr turlari uchun tuzilgan kodga kiritilmaydi (birinchi versiyada, agar u umuman qo'llab-quvvatlansa, u erda mavjud, chunki har bir parametr turi uchun ko'rsatmalar har xil), bu umumiy turlar va funktsiyalardan foydalanishga nisbatan ba'zi cheklovlarni belgilaydi. Java-da shunga o'xshash cheklovlar mavjud.

Umumiy sinf - bu bir yoki bir nechta turdagi o'zgaruvchiga ega bo'lgan sinf. class Pair () turi o'zgaruvchisi, usullarning qaytish turini va maydonlarning turlarini va mahalliy o'zgaruvchilarni aniqlash uchun ishlatiladi. Keyinchalik, tur o'zgaruvchisi uchun tip nomini almashtirish orqali umumiy turdagi ob'ektni yaratishingiz mumkin. Juftlik ()

Generika bo'yicha ba'zi cheklovlar 1. Tur parametrlari ibtidoiy turlarni qabul qila olmaydi. 2. Parametrlangan turlarning massivlariga yo'l qo'yilmaydi. 3. O'zgaruvchan turlarning nusxalarini yarata olmaysiz. 4. Statik kontekstda ruxsat berilmaydi. Umumiy dasturlashning maqsadi Umumiy dasturlash deganda har xil turdagi ob'ektlar bilan qayta ishlatilishi mumkin bo'lgan kod yozish tushuniladi. Bu sizning kodingizni o'qishni osonlashtiradi. Siz darhol ushbu aniq qator qatorida String moslamalarini o'z ichiga olganligini tushunishingiz mumkin. Tuzuvchi ushbu ma'lumotdan ham muvaffaqiyatli foydalanishi mumkin. Get () ga qo'ng'iroq qilishda kasting talab qilinmaydi. Tuzuvchi ushbu usulning qaytish turi Ob'ekt emas, String ekanligini biladi: String filename \u003d files.get (0); ArrayList-da add () usuli String parametriga ega ekanligini kompilyator ham biladi. Bu Ob'ekt turidagi parametr bilan ishlashdan ko'ra ancha xavfsizroq. Endi kompilyator noto'g'ri turdagi ob'ektni kiritmasligingizni tekshirishi mumkin. Masalan, quyidagi bayon kompilyatsiya qilinmaydi: files.add (yangi File ("...")); // ArrayList-ga faqat String moslamalarini qo'shish mumkin. // Compilation error ish vaqtidagi istisnoga qaraganda ancha yaxshi. Bu turdagi parametrlarning go'zalligi: ular sizning dasturingizni o'qishni osonlashtiradi va xavfsizligini ta'minlaydi. ArrayList kabi umumiy sinflardan foydalanish oson. Va aksariyat Java dasturchilari ArrayList kabi turlardan foydalanadilar - xuddi String massivlari singari tilning bir qismi bo'lganidek. (Albatta, ro'yxat massivlari oddiy massivlardan yaxshiroqdir, chunki ular avtomatik ravishda kengayishi mumkin.) Ammo umumiy sinfni amalga oshirish oson emas. Sizning kodingizdan foydalanadigan dasturchilar sizning turdagi parametrlaringiz uchun har xil sinflarni almashtirishga harakat qilishadi. Ular hamma narsaning zerikarli cheklovlarsiz va chalkash xato xabarlarsiz ishlashini kutmoqdalar. Sizning sinfingizdan kelajakda barcha mumkin bo'lgan foydalanishlarni taxmin qilish umumiy dasturchi sifatida sizning vazifangizdir. Umumiy kod va virtual mashina Virtual mashina umumiy ob'ektlar bilan ishlamaydi - barcha ob'ektlar umumiy sinflarga tegishli. Umumiy tip aniqlanganda, mos keladigan xom tip avtomatik ravishda yaratiladi. Ushbu turdagi nom turi parametrlari o'chirilgan umumiy tip nomi bilan bir xil. Turning o'zgaruvchilari o'chiriladi va ularning o'rniga cheklov turlari kiritiladi (yoki o'zgaruvchi cheklanmagan bo'lsa, ob'ekt turi). Masalan, Pair uchun xom turi quyidagicha ko'rinadi. public class Pair (public Pair (Object first, Object second) (this.first \u003d first; this.second \u003d second;) public Object getFirst () (return return first;) public Object getSecond () (return second;) public void setFirst) (Object newValue) (first \u003d newValue;) public void setSecond (Object newValue) (second \u003d newValue;) private Object first; private Object second;) T cheksiz tip o'zgaruvchisi bo'lgani uchun, uni shunchaki Object bilan almashtirishadi. Natijada Java dasturlash tiliga genericlardan oldin siz ilgari amalga oshirgan bo'lishi mumkin bo'lgan umumiy sinf mavjud. Sizning dasturlaringiz Pair yoki Pair kabi turli xil variantlarni o'z ichiga oladi, ammo bu "tozalash" ularni "xom" Pair turiga aylantiradi. "Xom" turi tipdagi o'zgaruvchilarni birinchi cheklov bilan almashtiradi, yoki cheklovlar bo'lmasa, Ob'ekt. Masalan, Pair sinfidagi tip o'zgaruvchisi aniq cheklovlarga ega emas va shuning uchun xom tip T o'rnini Ob'ekt bilan almashtiradi. Keling, biroz boshqacha tur e'lon qilingan deb taxmin qilaylik: umumiy sinf Interval Serializable (public Interval (T first, T second)) (agar (first.compareTo (second))<= 0) { lower = first; upper = second; } else { lower = second; upper = first; } } ... private T lower; private T upper; } Сырой тип Interval выглядит следующим образом: public class Interval implements Serializable { public Interval(Comparable first, Comparable second) { ... } ... private Comparable lower; private Comparable upper; } Трансляция обобщенных выражений Когда ваша программа вызывает обобщенный метод, компилятор вставляет приведения, когда удаляется возвращаемый тип. Например, рассмотрим следующую последовательность операторов: Pair buddies = ...; Employee buddy = buddies.getFirst(); Подчистка getFirst() приведет к возврату типа Object. Компилятор автоматически вставит приведение к Employee. То есть компилятор транслирует вызов метода в две инструкции виртуальной машины. . Вызов сырого метода Pair.getFirst(). . Приведение возвращенного объекта Object к типу Employee. Приведения также вставляются при обращении к обобщенному полю. Предположим, что поля first и second были бы общедоступными, т.е. public. (Возможно, это нехороший стиль программирования, но вполне допустимый в Java.) Тогда в оператор Employee buddy = buddies.first; в результирующем байт-коде также будут вставлены приведения.

Maqola sizga yoqdimi? Do'stlar bilan bo'lishish uchun: