Поништавања у ВБ.НЕТ

Ово је једна од мини серија које покривају разлике у Преоптерећењима, Сенкама и Прекорачењем у ВБ.НЕТ. Овај чланак покрива поништавања. Чланци који покривају остале су овде:

-> Преоптерећења
-> Сенке

Ове технике може бити врло збуњујуће; постоји пуно комбинација ових кључних речи и основних могућности наслеђивања. Мицрософтова сопствена документација не почиње правити тему и на Интернету има пуно лоших или застарелих информација. Најбољи савет да будете сигурни да је ваш програм правилно кодиран јесте: "Испитајте, тестирајте и тестирајте поново." У овој серији погледаћемо их једну по једну са нагласком на разлике.

Поништавања

Оно што заједничким словима има Схадовс, Оверлоадс и Оверридес је да поново користе назив елемената док мењају оно што се дешава. Сенке и преоптерећења могу да раде и унутар исте класе или када су а класа наслеђује друга класа. Поништавања се, међутим, могу користити само у изведеној класи (која се понекад назива и дечја класа) која наслеђује од а основна класа (понекад се назива родитељска класа). А Оверридес је чекић; омогућава вам да у потпуности замените методу (или својство) из основне класе.

instagram viewer

У чланку о класама и кључној речи Схадовс (Погледајте: Схадовс у ВБ.НЕТ) додана је функција која показује да се на наслеђену процедуру може упутити.

Публиц Цласс ПрофессионалЦонтацт. '... код није приказан... Јавна функција ХасхТхеНаме ( БиВал нм Ас Стринг) Као стринг. Повратак нм. ГетХасхЦоде. Завршна функција Енд Цласс.

Код који иницира класу изведену из ове (ЦодедПрофессионалЦонтацт у примеру) може назвати ову методу јер је наследна.

У примеру сам користио ВБ.НЕТ ГетХасхЦоде метода да би код био једноставан и то је вратило прилично бескористан резултат, вриједност -520086483. Претпоставимо да сам желео другачији резултат уместо тога, али,

-> Не могу променити основну класу. (Можда је све што имам је састављен код од продавца.)

... и ...

-> Не могу променити позивни код (можда постоји хиљаду примерака и не могу да их ажурирам.)

Ако могу да ажурирам изведену класу, онда могу да променим враћени резултат. (На пример, код би могао да буде део ДЛЛ-а за надоградњу.)

Постоји један проблем. Будући да је тако свеобухватан и моћан, морате имати дозволу од основне класе да бисте користили Оверридес. Али добро дизајниране библиотеке кода то пружају. (Твој Библиотеке кода су све добро дизајниране, зар не?) На примјер, Мицрософт-ова функција коју смо управо користили може се надгледати. Ево примера синтаксе.

Јавна функција за надметање ГетХасхЦоде као цео број

Дакле, та кључна реч мора бити присутна и у нашој основној класи.

Јавна функција за надгледање ХасхТхеНаме ( БиВал нм Ас Стринг) Као стринг.

Надјачавање методе сада је једноставно као пружање новог кључном речју Оверридес. Висуал Студио опет вам покреће почетак испуњавањем кода за вас са аутоматским довршавањем. Када уђете ...


Функција јавног поништавања ХасхТхеНаме (

Висуал Студио аутоматски додаје остатак кода чим укуцате заградне заграде, укључујући повратну изјаву која само из оригиналне функције позива из основне класе. (Ако само додајете нешто, ово је обично добра ствар након што се нови код изврши.)

Функција јавног поништавања ХасхТхеНаме ( нм као стринг) као стринг. Врати МиБасе. ХасхТхеНаме (нм) Завршна функција

У овом случају ћу ипак заменити методу нечим другим једнако бескорисним само да илуструјем како се то ради: ВБ.НЕТ функција која ће преокренути низ.

Функција јавног поништавања ХасхТхеНаме ( нм као стринг) као стринг. Вратите Мицрософт. Вижуал бејзик. СтрРеверсе (нм) Завршна функција

Сада позивни код добија сасвим другачији резултат. (Упоредите с резултатом у чланку о Сенкама.)


ЦонтацтИД: 246. Име предузећа: Виллаин Дефеатерс, ГмбХ. Хасх оф тхе БусинессНаме: ХбмГ, сретаефеД ниаллиВ. 

Такође можете надјачати својства. Претпоставимо да сте одлучили да ЦонтацтИД вредности веће од 123 неће бити дозвољене и требале би бити задане на 111. Можете само надјачати својство и променити га када се својство сачува:

Приватни _ЦонтацтИД као Интегер. Јавно надгледа имовину ЦонтацтИД као интегрисани. Добити. Врати _ЦонтацтИД. Енд Гет. Подеси (БиВал вредност као Интегер) Ако је вредност> 123 Тада. _ЦонтацтИД = 111. Остало. _ЦонтацтИД = вредност. Енд Иф. Енд Сет Енд Проперти.

Тада добијате овај резултат када се пренесе већа вредност:


ЦонтацтИД: 111. Име предузећа: Дамсел Ресцуерс, ЛТД. 

Узгред, у досадашњем примјеру кода, цијеле вриједности су удвостручене у Новом потпрограм (Погледајте чланак о Сенкама), па се цели број 123 мења у 246 и поново мења у 111.

ВБ.НЕТ вам даје још већу контролу тако што дозвољава основној класи да изричито захтева или забрани изведену класу да превлада користећи МустОверриде и НотОверридабле кључне речи у основној класи. Али и једно и друго се користи у прилично специфичним случајевима. Прво, НотОверридабле.

Пошто је задана вредност за јавну класу НотОверридабле, зашто бисте је уопште требали специфицирати? Ако га испробате на функцији ХасхТхеНаме у основној класи, добићете синтаксичку грешку, али текст поруке о грешци даје вам појма:

'НотОверридабле' се не може одредити за методе које не надјачавају другу методу.

Задана поставка за поништену методу је управо супротно: Оверридеабле. Дакле, ако желите да се прегласавање дефинитивно заустави на томе, морате навести методу НотОверридабле на тој методи. У нашем примеру код:


Јавно НотОверридабле Поништавања Функција ХасхТхеНаме (... 

Онда ако је класа ЦодедПрофессионалЦонтацт заузврат наследјена ...


Јавна класа НотОверридаблеЕк. Наследи ЦодедПрофессионалЦонтацт. 

... функција ХасхТхеНаме се не може надјачати у тој класи. Елемент који се не може надјачати понекад се назива и запечаћеним елементом.

Основни део тхе тхеНЕТ Фондација је захтевати да је сврха сваке класе изричито дефинисана да уклони сву несигурност. Проблем у претходним ООП језицима назван је "крхка основна класа." То се дешава када је база класа додаје нову методу са истим именом као и име методе у поткласи која наслеђује од базе класа. Програмер који пише подкласу није планирао прегласавање основне класе, али то се ионако управо догађа. То се знало да резултира криком рањеног програмера: „Нисам ништа променио, али мој се програм срушио свеједно. "Ако постоји могућност да се класа у будућности ажурира и створи овај проблем, пријавите је као НотОверридабле.

МустОверриде се најчешће користи у ономе што се назива апстрактна класа. (У Ц #, иста ствар користи кључну реч Сажетак!) Ово је класа која само пружа образац и од вас се очекује да га испуните сопственим кодом. Мицрософт даје овај пример једног:

Јавна машина за прање аутомобила МустИнхерит. Суб Нев () 'Овде је код за потврђивање наставе. Крај суб. Јавно МустОверриде Суб Васх. Јавно МустОверриде суб испирање (лоадСизе ас Интегер) Јавна функција МустОверриде Спин (брзина као цео број) као дугачка. Енд Цласс.

За наставак Мицрософтовог примера, машине за прање веша раде ове ствари (прање, испирање и центрифугирање) сасвим другачије, тако да нема предности дефинисања функције у основној класи. Али постоји предност у осигуравању да било која класа која наследи ову класу чини дефинишите их. Решење: апстрактна класа.

Ако вам треба још више објашњења о разликама између преоптерећења и поништења, у кратком савету је развијен потпуно другачији пример: Преоптерећења у односу на поништавања

ВБ.НЕТ вам даје још већу контролу тако што омогућава основној класи да посебно захтева или ускраћује изведену класу да превладава користећи кључне речи МустОверриде и НотОверридабле у основној класи. Али и једно и друго се користи у прилично специфичним случајевима. Прво, НотОверридабле.

Пошто је задана вредност за јавну класу НотОверридабле, зашто бисте је уопште требали специфицирати? Ако га испробате на функцији ХасхТхеНаме у основној класи, добићете синтаксичку грешку, али текст поруке о грешци даје вам појма:

'НотОверридабле' се не може одредити за методе које не надјачавају другу методу.

Задана поставка за поништену методу је управо супротно: Оверридеабле. Дакле, ако желите да се прегласавање дефинитивно заустави на томе, морате навести методу НотОверридабле на тој методи. У нашем примеру код:


Јавно НотОверридабле Поништавања Функција ХасхТхеНаме (... 

Онда ако је класа ЦодедПрофессионалЦонтацт заузврат наследјена ...


Јавна класа НотОверридаблеЕк. Наследи ЦодедПрофессионалЦонтацт. 

... функција ХасхТхеНаме се не може надјачати у тој класи. Елемент који се не може надјачати понекад се назива и запечаћеним елементом.

Основни део .НЕТ фондације је да захтева да је сврха сваке класе изричито дефинисана да уклони сву несигурност. Проблем у претходним ООП језицима назван је "крхка основна класа." То се дешава када је база класа додаје нову методу са истим именом као и име методе у поткласи која наслеђује од базе класа. Програмер који пише подкласу није планирао прегласавање основне класе, али то се ионако управо догађа. То се знало да резултира криком рањеног програмера: „Нисам ништа променио, али мој се програм срушио свеједно. "Ако постоји могућност да се класа у будућности ажурира и створи овај проблем, пријавите је као НотОверридабле.

МустОверриде се најчешће користи у ономе што се назива апстрактна класа. (У Ц #, иста ствар користи кључну реч Сажетак!) Ово је класа која само пружа образац и од вас се очекује да га испуните сопственим кодом. Мицрософт даје овај пример једног:

Јавна машина за прање аутомобила МустИнхерит. Суб Нев () 'Овде је код за потврђивање наставе. Крај суб. Јавно МустОверриде Суб Васх. Јавно МустОверриде суб испирање (лоадСизе ас Интегер) Јавна функција МустОверриде Спин (брзина као цео број) као дугачка. Енд Цласс.

За наставак Мицрософтовог примера, машине за прање веша раде ове ствари (прање, испирање и центрифугирање) сасвим другачије, тако да нема предности дефинисања функције у основној класи. Али постоји предност у осигуравању да било која класа која наследи ову класу чини дефинишите их. Решење: апстрактна класа.

Ако вам треба још више објашњења о разликама између преоптерећења и поништења, у кратком савету је развијен потпуно другачији пример: Преоптерећења у односу на поништавања