Ohittaa VB.NET: ssä

click fraud protection

Tämä on yksi minisarjoista, joka kattaa ylikuormitusten, varjojen ja ohitusten erot VB.NET. Tämä artikkeli kattaa ohitukset. Artikkeleita, jotka kattavat muut, ovat täällä:

-> Ylikuormitukset
-> Varjot

Nämä tekniikat voi olla erittäin hämmentävä; Näiden avainsanojen ja niiden perimisvaihtoehtojen yhdistelmiä on paljon. Microsoftin omat asiakirjat eivät aio tehdä aiheen oikeudenmukaisuutta, ja Internetissä on paljon huonoja tai vanhentuneita tietoja. Paras neuvo varmistaa, että ohjelmasi on koodattu oikein, on "Testaa, testaa ja testaa uudelleen". Tässä sarjassa tarkastellaan niitä yksi kerrallaan korostaen eroja.

ohitukset

Varjoilla, ylikuormituksilla ja ohituksilla on yhteistä se, että he käyttävät elementtien nimeä uudelleen muuttaen samalla mitä tapahtuu. Varjot ja Ylikuormitukset voivat toimia molemmat saman luokan sisällä tai kun a luokka perii toinen luokka. Ohituksia voidaan kuitenkin käyttää vain johdetussa luokassa (jota joskus kutsutaan lapsiluokkaksi), joka perii a: sta perusluokka

instagram viewer
(kutsutaan joskus vanhemmaluokkaksi). Ja Overrides on vasara; Sen avulla voit korvata menetelmän (tai ominaisuuden) kokonaan perusluokasta.

Luokkia ja varjoja koskevaa avainsanaa koskevassa artikkelissa (katso: Varjot VB.NET: ssä) lisättiin toiminto, joka osoittaa, että perittyyn menettelyyn voidaan viitata.

Public Class ProfessionalContact. '... koodia ei näytetä... Julkinen toiminto HashTheName ( ByVal nm kuin merkkijono) kuin merkkijono. Paluu nm. GetHashCode. Lopeta toiminto. Loppu luokka.

Tästä johdettua luokkaa (4) johtava koodi (esimerkissä CodedProfessionalContact) voi kutsua tätä menetelmää, koska se on peritty.

Esimerkissä käytin VB.NET: ää GetHashCode menetelmä pitää koodi yksinkertaisena ja tämä tuotti melko hyödytöntä tulosta, arvo -520086483. Oletetaan, että halusin sen sijaan erilaisen tuloksen.

-> En voi muuttaa perusluokkaa. (Ehkä kaikki, mitä minulla on, on koottu koodia myyjältä.)

... ja ...

-> En voi muuttaa soittokoodia (Ehkä niitä on tuhat kappaletta, enkä voi päivittää niitä.)

Jos voin päivittää johdetun luokan, voin muuttaa palautetun tuloksen. (Esimerkiksi koodi voi olla osa päivitettävää DLL-tiedostoa.)

On yksi ongelma. Koska se on niin kattava ja tehokas, sinulla on oltava perusluokan lupa Ohitusten käyttämiseen. Mutta hyvin suunnitellut koodikirjastot tarjoavat sen. (teidän koodikirjastot ovat kaikki hyvin suunniteltuja, eikö?) Esimerkiksi äskettäin käyttämämme Microsoftin toiminto on yliohjautuva. Tässä on esimerkki syntaksista.

Julkinen ylihyväksyttävä toiminto GetHashCode kokonaislukuna

Joten kyseisen avainsanan on oltava läsnä myös esimerkkiperusluokassamme.

Julkinen ylihyväksyttävä toiminto HashTheName ( ByVal nm kuin merkkijono) kuin merkkijono.

Menetelmän ohittaminen on nyt yhtä yksinkertainen kuin uuden avainsanan tarjoaminen. Visual Studio antaa taas käynnistymisen täyttämällä sinulle koodin AutoComplete. Kun kirjoitat ...


Julkinen ohitustoiminto HashTheName (

Visual Studio lisää loput koodista automaattisesti heti, kun kirjoitat avaussulun, mukaan lukien paluulauseke, joka vain kutsuu alkuperäistä toimintoa perusluokasta. (Jos lisäät vain jotain, tämä on yleensä hyvä tehdä, kun uusi koodi on joka tapauksessa suoritettu.)

Julkinen ohitustoiminto HashTheName ( nm Kuten merkkijono) Kuten merkkijono. Palauta MyBase. HashTheName (nm) Lopeta toiminto.

Tässä tapauksessa aion kuitenkin korvata menetelmän jollain muulla yhtä hyödyttömällä vain havainnollistaakseni miten se tapahtuu: VB.NET-toiminto, joka kääntää merkkijonon.

Julkinen ohitustoiminto HashTheName ( nm Kuten merkkijono) Kuten merkkijono. Palauta Microsoft. VisualBasic. StrReverse (nm) Lopeta toiminto.

Nyt kutsukoodi saa aivan toisen tuloksen. (Vertaa varjojen artikkelin tulokseen.)


Yhteystiedot: 246. Yrityksen nimi: Villain Defeaters, GmbH. Yrityksenimen ripaus: HbmG, SretaefeD nialliV. 

Voit myös ohittaa ominaisuudet. Oletetaan, että päätitte, että yli 123: n ContactID-arvoja ei sallita ja että niiden oletusarvo on 111. Voit vain ohittaa ominaisuuden ja muuttaa sitä, kun omaisuus tallennetaan:

Yksityinen _ContactID kokonaislukuna. Julkinen ohittaa kiinteistön ContactID kokonaislukuna. Saada. Palauta _ContactID. End Get. Aseta (ByVal-arvo kokonaislukuna) Jos arvo> 123 Sitten. _ContactID = 111. Muuta. _ContactID = arvo. Loppu Jos. End Set. Lopeta omaisuus.

Sitten saat tämän tuloksen, kun suurempi arvo on annettu:


Yhteystiedot: 111. Yrityksen nimi: Damsel Rescuers, LTD. 

Muuten, toistaiseksi esimerkikoodissa kokonaislukuarvot kaksinkertaistuvat uudessa aliohjelma (Katso varjojen artikkeli), joten kokonaisluku 123 muuttuu 246: ksi ja sitten uudelleen 111: ksi.

VB.NET antaa sinulle vieläkin paremman hallinnan sallimalla perusluokalla vaatia tai kieltää johdetun luokan ohittamisen käyttämällä perustason MustOverride- ja NotOverridable-avainsanoja. Mutta molempia näitä käytetään melko erityistapauksissa. Ensinnäkin, Ei ylläpidettävissä.

Koska julkisen luokan oletusarvo on NotOverrivable, miksi sinun pitäisi koskaan määritellä se? Jos kokeilet sitä perusluokan HashTheName-toiminnolla, saat syntaksivirheen, mutta virhesanoman teksti antaa sinulle vihjeen:

'NotOverridable' -määrittelyä ei voida määrittää menetelmille, jotka eivät ohita toista menetelmää.

Ohitetun menetelmän oletus on aivan päinvastainen: Ohittamaton. Joten jos haluat ohittaa ehdottomasti lopettaa siellä, sinun on määritettävä NotOverridable kyseisessä menetelmässä. Esimerkkikoodissamme:


Ei julkista ohitukset Toiminto HashTheName (... 

Sitten jos luokka CodedProfessionalContact on puolestaan ​​peritty ...


Public Class NotOverridableEx. Perityt koodatut ammattiyhteydet. 

... HashTheName-funktiota ei voida ohittaa kyseisessä luokassa. Elementtiä, jota ei voida ohittaa, kutsutaan joskus sinetöityyn elementtiin.

Olennainen osa .NET-säätiö on vaatia, että jokaisen luokan tarkoitus on määritelty nimenomaisesti kaiken epävarmuuden poistamiseksi. Edellisten OOP-kielten ongelmaa on kutsuttu nimellä ”herkkä perusluokka”. Tämä tapahtuu, kun tukikohta luokka lisää uuden menetelmän samalla nimellä kuin menetelmän nimi alaluokassa, joka perii pohjasta luokka. Alaluokkaa kirjoittava ohjelmoija ei suunnitellut perusluokan ohittamista, mutta näin tapahtuu joka tapauksessa. Tämän tiedetään johtavan haavoittuneen ohjelmoijan huutoon: "En muuttanut mitään, mutta ohjelmasi kaatui muutenkin. "Jos on mahdollista, että luokka päivitetään tulevaisuudessa ja luo tämän ongelman, ilmoita siitä luokka NotOverridable.

MustOverride: tä käytetään yleisimmin abstraktissa luokassa. (Kohdassa C # sama asia käyttää avainsanaa Abstract!) Tämä on luokka, joka tarjoaa vain mallin ja sinun odotetaan täyttävän sen omalla koodilla. Microsoft tarjoaa tämän esimerkin yhdestä:

Julkinen MustInherit-luokan pesukone. Sub Uusi () 'Koodi luokan välittämiseen menee tänne. Lopeta alaosa. Julkinen MustOverride Sub -pesu. Julkinen MustOverride-alahuuhtelu (loadSize kokonaislukuna) Julkinen MustOverride-toiminnon linkous (nopeus kokonaislukuna) niin kauan. Loppu luokka.

Jatkaen Microsoftin esimerkkiä pesukoneet tekevät nämä asiat (pese, huuhtele ja kehrä) melko eri tavalla, joten toiminnon määrittelemiseen perusluokassa ei ole mitään etua. Mutta etuna on varmistaa, että jokainen luokka, joka perii tämän luokan tekee määrittele ne. Ratkaisu: abstrakti luokka.

Jos tarvitset vielä lisää selitystä ylikuormitusten ja ohitusten eroista, pikavihjeessä kehitetään täysin erilainen esimerkki: Ylikuormitukset vs. ohitukset

VB.NET antaa sinulle entistä paremman hallinnan sallimalla perusluokalla vaatia tai kieltäytyä johdetun luokan ohittamisesta käyttämällä perustason MustOverride- ja NotOverridable-avainsanoja. Mutta molempia näitä käytetään melko erityistapauksissa. Ensinnäkin, Ei ylläpidettävissä.

Koska julkisen luokan oletusarvo on NotOverrivable, miksi sinun pitäisi koskaan määritellä se? Jos kokeilet sitä perusluokan HashTheName-toiminnolla, saat syntaksivirheen, mutta virhesanoman teksti antaa sinulle vihjeen:

'NotOverridable' -määrittelyä ei voida määrittää menetelmille, jotka eivät ohita toista menetelmää.

Ohitetun menetelmän oletus on aivan päinvastainen: Ohittamaton. Joten jos haluat ohittaa ehdottomasti lopettaa siellä, sinun on määritettävä NotOverridable kyseisessä menetelmässä. Esimerkkikoodissamme:


Ei julkista ohitukset Toiminto HashTheName (... 

Sitten jos luokka CodedProfessionalContact on puolestaan ​​peritty ...


Public Class NotOverridableEx. Perityt koodatut ammattiyhteydet. 

... HashTheName-funktiota ei voida ohittaa kyseisessä luokassa. Elementtiä, jota ei voida ohittaa, kutsutaan joskus sinetöityyn elementtiin.

Olennainen osa .NET-säätiötä on vaatia, että jokaisen luokan tarkoitus on määritelty nimenomaisesti kaiken epävarmuuden poistamiseksi. Edellisten OOP-kielten ongelmaa on kutsuttu nimellä ”herkkä perusluokka”. Tämä tapahtuu, kun tukikohta luokka lisää uuden menetelmän samalla nimellä kuin menetelmän nimi alaluokassa, joka perii pohjasta luokka. Alaluokkaa kirjoittava ohjelmoija ei suunnitellut perusluokan ohittamista, mutta näin tapahtuu joka tapauksessa. Tämän tiedetään johtavan haavoittuneen ohjelmoijan huutoon: "En muuttanut mitään, mutta ohjelmasi kaatui muutenkin. "Jos on mahdollista, että luokka päivitetään tulevaisuudessa ja luo tämän ongelman, ilmoita siitä luokka NotOverridable.

MustOverride: tä käytetään yleisimmin abstraktissa luokassa. (Kohdassa C # sama asia käyttää avainsanaa Abstract!) Tämä on luokka, joka tarjoaa vain mallin ja sinun odotetaan täyttävän sen omalla koodilla. Microsoft tarjoaa tämän esimerkin yhdestä:

Julkinen MustInherit-luokan pesukone. Sub Uusi () 'Koodi luokan välittämiseen menee tänne. Lopeta alaosa. Julkinen MustOverride Sub -pesu. Julkinen MustOverride-alahuuhtelu (loadSize kokonaislukuna) Julkinen MustOverride-toiminnon linkous (nopeus kokonaislukuna) niin kauan. Loppu luokka.

Jatkaen Microsoftin esimerkkiä pesukoneet tekevät nämä asiat (pese, huuhtele ja kehrä) melko eri tavalla, joten toiminnon määrittelemiseen perusluokassa ei ole mitään etua. Mutta etuna on varmistaa, että jokainen luokka, joka perii tämän luokan tekee määrittele ne. Ratkaisu: abstrakti luokka.

Jos tarvitset vielä lisää selitystä ylikuormitusten ja ohitusten eroista, pikavihjeessä kehitetään täysin erilainen esimerkki: Ylikuormitukset vs. ohitukset

instagram story viewer