Типларни алмаштириш амаллари фойдаланувчи амаллари типарини ошкор ёки ошкормас кўринишда алмаштириш имконини беради. Типларни алмаштириш амаллари қуйидаги схема остида эълон қилинади:
implicit operator тип ( параметр ) // ошкормас алмаштириш explicit operator тип ( параметр ) // ошкор алмаштириш Бу амаллар параметр типидаги маълумотларни амал сарлавҳасида кўрсатилган типга алмаштиради. Бу типлардан бири амал аниқланган класс бўлиши керак. Шундай қилиб, амаллар класс типидаги маълумотларни бошқа типга ёки аксинча алмаштиришларни бажаради. Алмаштирилаётган тпплар ворислик муносабатлари билан боғланмаган бўлиши шарт. Monster классси учун типларни алмаштиришга мисоллар:
public static implicit operator int( Monster m ) { return m.health; } public static explicit operator Monster( int h ) { return new Monster( h, 100, "FromInt" ); } Қуйида дастур таркибида типларни алмаштириш учун намуналар келтирилган:
Monster Masha = new Monster( 200, 200, "Masha" ); int i = Masha; // ошкормас алмаштириш Masha = (Monster) 500; // ошкор алмаштириш Классдаги барча амаллар турли сигнатураларга эга бўлиши керак. Методларнинг бошқа кўринишларидан фарқли ўлароқ, типларни алмаштириш амаллари учун қайтарилиши керак бўлган қиймат типлари сигнатураларга киритилиши лозим. Implicit ва explicit хизматчи сўзилари сигнатураларга киритилмайди ва демак, битта алмаштириш учун бир вақтда ошкор ва ошкормас тип алмаштиришларни аниқлаб бўлмайди.
Ошкормас алмаштиришларни аниқлашда уларнинг бажарилиши жараёнида аниқликнинг йўқолмаслиги ва истисноли вазиятлар юза келмаслиги шарт.
Қайта юкланадиган класс ва амалларга намуна
Қуйидаги масала берилган бўлсин.
Матнли файлда ташкилотнинг ходимлар бўлими маълумотлар базаси берилган. Бу ташкилотда 100 та ходим ишлайди. Файлнинг хар бир сатри битта ходим ҳақидаги маълумотларни сақлайди. Ёзувларнинг ўлчами қуйидагича: фамилия ва исми (30 та белги, фамилиялар 1 белгидан бошланади), туғилган йили (5 та белги), иш ҳақи (10 та белги). Берилган фамилия бўйича ходим ҳақидаги маълумотларни хамда сўралган ходимларнинг ўртача иш ҳақларини экранга чиқарувчи дастур ишлаб чиқинг. Бу масалани ҳал қилиш учун “ходим” классини яратиш ва бу кклассдаги экземплярлардан массив ташкил қилиш керак. Классни тавсифлашда бу классга нималарни киритиш лозим? деган саволга жавоб топиш талаб қилинади. Табиийки, биринчи вазифа - бу ходимлар ҳақидаги маълумотларни сақлашдан иборат. Бу маълумотлардан фойдаланиш учун мижоз (фойдаланувчи код) бу маълумотларни ўқиш имкониятига эга бўлиши керак. Бундан ташқари, ходимларни излаш учун уларни берилган маълумот билан солтиштириш хам назарда тутилади.
Класс майдонларини инкапсульяция приципига кўра ёпиқ усулда ташкил қиламиз. Бу бизга маълумотларни киритиш жараёнини назорат қилиш учун керак. Нотўғри маълумотларни киритишга уринишларни истино механизмидан фойдаланилади. Классни универсал бўлиши учун унга ходим иш ҳақини класс амалларини қайта юклаш орқали ошириш ёки камайтириш имконини эътиборга оламиз.
Шундай қилиб, масалани ечишнинг умумий тартибини қуйидагича ёзиш мумкин:
I. Бошланғич маълумотлар, натижалар ва оралиқ катталиклар.
Бошланғич маълумотлар. Ходимлар базаси матнли файлда сақланади. Файлдаги сатрларнинг максимал сони 100 та.
Натижалар. Дастур эакранга талаб қилинган маълумотларни чиқариши лозим. Бу маълумотлар бошланғич маълумотлар таркибида бўлгани учун уларга қўшимча хотира ажратиш шарт эмас. Бундан ташқари ходимларнинг ўртача иш ҳақини ҳам ҳисоблаш талаб қилингани учун ҳақиқий типдаги ўзгарувчи киритамиз..
II. Масалани ечиш алгоритми қуйидагича: Файлдан массивга ходимлар ҳақидаги маълумотларни ўқиш .
Ходим ҳақидаги маълумотларни чиқариш циклини ташкил қилиш:
Ходим ҳақидаги маълумотларни ёки уларнинг йўқлигини чоп қилиш;
ўртача иш ҳақини чоп қилиш.
Ходимлар ҳақидаги циклдан қандай қилиб чиқиш кераклигини аниқлаш лозим. Циклдан фамилия ўрнига Enter тугмаси чертилганда чиқишга келишиб оламиз 19.3-листинг).
using System;