Nepaisoma VB.NET

Tai yra viena iš mini serijų, apimančių perkrovų, šešėlių ir nepaisymo skirtumus VB.NET. Šis straipsnis apima nepaisymus. Apie kitus straipsnius rasite čia:

-> perkrovos
-> Šešėliai

Šios technikos gali būti labai painus; yra daugybė šių raktinių žodžių derinių ir pagrindinės paveldėjimo galimybės. Pati „Microsoft“ dokumentacija nepradėjo teisingumo tema, todėl internete yra daug blogos ar pasenusios informacijos. Geriausias patarimas norint įsitikinti, ar jūsų programa užkoduota teisingai, yra „Tikrinti, išbandyti ir vėl išbandyti“. Šioje serijoje pažvelgsime į juos po vieną, pabrėždami skirtumus.

Nepaisoma

Šešėlių, perkrovų ir nepaisymų bendras dalykas yra tas, kad jie pakartotinai naudoja elementų pavadinimus, keisdami tai, kas atsitinka. Šešėliai ir perkrovos gali veikti tiek toje pačioje klasėje, tiek kai klasė paveldi kita klasė. Tačiau nepaisymai gali būti naudojami tik išvestinėje klasėje (kartais vadinamoje vaikų klase), kuri paveldima iš bazinė klasė (kartais vadinama tėvų klase). O nepaisymas yra plaktukas; tai leidžia visiškai pakeisti metodą (arba savybę) iš bazinės klasės.

instagram viewer

Straipsnyje apie klases ir „Shadows“ raktinį žodį (žr.: „Šešėliai“ VB.NET) buvo pridėta funkcija, parodanti, kad galima remtis paveldima procedūra.

Visuomenės klasė „ProfessionalContact“. '... kodas nerodomas... Viešosios funkcijos „HashTheName“ ( ByVal nm kaip styga) kaip styga. Grąžinimo nm. „GetHashCode“. Pabaigos funkcija. Pabaigos klasė.

Kodas, kuris pagyvina klasę, išvestą iš šios klasės (pavyzdyje „CodedProfessionalContact“), gali vadinti šį metodą, nes jis paveldimas.

Pavyzdyje naudojau VB.NET „GetHashCode“ metodas, kad kodas būtų paprastas, ir gautas gana nenaudingas rezultatas, kurio vertė -520086483. Tarkime, aš norėjau, kad būtų grąžintas kitoks rezultatas, bet,

-> Aš negaliu pakeisti pagrindinės klasės. (Galbūt viskas, ką turiu, yra sudaryta iš pardavėjo.)

... ir ...

-> Negaliu pakeisti skambučio kodo (gali būti tūkstantis egzempliorių ir negaliu jų atnaujinti.)

Jei galiu atnaujinti išvestinę klasę, tada galiu pakeisti grąžintą rezultatą. (Pavyzdžiui, kodas gali būti atnaujinamo DLL dalis.)

Yra viena problema. Kadangi jis yra toks išsamus ir galingas, turite naudoti bazinės klasės leidimą naudoti nepaisymus. Bet gerai suplanuotos kodų bibliotekos tai teikia. (Tavo kodų bibliotekos yra gerai suprojektuotos, tiesa?) Pavyzdžiui, ką tik panaudota „Microsoft“ funkcija yra neperduodama. Štai sintaksės pavyzdys.

Visuomenei tinkama naudoti „GetHashCode“ funkcija kaip sveikasis skaičius

Taigi šis raktinis žodis turi būti ir mūsų bazinės klasės pavyzdyje.

Vieša neperduodama funkcija „HashTheName“ ( ByVal nm kaip styga) kaip styga.

Nepaisoma metodo dabar yra taip paprasta, kaip pateikti naują su nepaisymo raktiniu žodžiu. „Visual Studio“ vėl pradeda veikti, užpildydami jums skirtą kodą automatiniu užbaigimu. Kai įvesite ...


Viešas nepaisymas „HashTheName“ funkcijos (

„Visual Studio“ automatiškai prideda likusį kodą, kai tik įvedate atidarymo skliaustus, įskaitant grąžinimo teiginį, kuris iš pagrindinės klasės iškviečia tik originalią funkciją. (Jei ką tik pridedate, paprastai tai reikia padaryti po to, kai jūsų naujasis kodas bus vykdomas.)

Viešas nepaisymas „HashTheName“ funkcijos ( nm kaip styga) kaip styga. Grąžinkite „MyBase“. „HashTheName“ (nm) Pabaigos funkcija.

Tačiau šiuo atveju aš pakeisiu metodą kažkuo kitu, nenaudingu tik tam, kad parodyčiau, kaip tai daroma: VB.NET funkcija, kuri pakeis eilutę.

Viešas nepaisymas „HashTheName“ funkcijos ( nm kaip styga) kaip styga. Grąžinkite „Microsoft“. Visual Basic. StrReverse (nm) Pabaigos funkcija.

Dabar telefono kodas gaunamas visai kitoks. (Palyginkite su rezultatu straipsnyje apie šešėlį.)


„KontaktID“: 246. Verslo vardas: Villain Defeaters, GmbH. Verslo vardo keitimas: HbmG, sretaefeD nialliV. 

Taip pat galite nepaisyti savybių. Tarkime, kad nusprendėte, kad didesnės nei 123 „ContactID“ vertės nebus leidžiamos ir numatytoji reikšmė bus 111. Galite tiesiog nepaisyti nuosavybės ir pakeisti ją išsaugoję nuosavybę:

Asmeninis _ContactID kaip sveikasis skaičius. Visuomenė nepaiso nuosavybės „ContactID“ kaip sveikojo skaičiaus. Gaukite. Grąžinti _ContactID. Pabaiga gauti. Nustatyti („ByVal“ vertė kaip sveikasis skaičius) Jei vertė> 123 Tada. _ContactID = 111. Kitas. _ContactID = vertė. Pabaiga Jei. Pabaigos rinkinys. Pabaigos nuosavybė.

Tada gausite šį rezultatą, kai bus perduota didesnė vertė:


Kontaktinis ID: 111. Verslo vardas: „Damsel Rescuers, LTD“. 

Beje, kol kas pavyzdyje kodo sveikosios vertės yra dvigubai didesnės nei Naujųjų paprogramė (Žr. Straipsnį apie šešėliai), taigi sveikasis skaičius 123 keičiamas į 246, o tada vėl keičiamas į 111.

VB.NET suteikia dar didesnį valdymą, leisdamas pagrindinei klasei konkrečiai reikalauti arba atsisakyti išvestinės klasės perrašymo, naudojant pagrindinės klasės „MustOverride“ ir „NotOverridable“ raktinius žodžius. Bet abu šie atvejai naudojami gana specifiniais atvejais. Pirma, „NotOverrivable“.

Kadangi viešosios klasės numatytoji reikšmė yra Neperleidžiama, kodėl turėtumėte kada nors ją nurodyti? Jei išbandysite tai naudodami pagrindinės klasės funkciją „HashTheName“, gausite sintaksės klaidą, tačiau klaidos pranešimo tekstas nurodo:

Metodams, kurie nenusileidžia kitam metodui, negalima nurodyti „NotOverridable“.

Numatytoji reikšmė nepaisomajam metodui yra visiškai priešinga: Nepaisoma. Taigi, jei norite, kad viršesnis reikalavimas tikrai sustotų, turite nurodyti „NotOverridable“ tame metode. Mūsų pavyzdžio kode:


Viešas neperžiūrimas Nepaisoma Funkcija „HashTheName“ (... 

Tada, jei klasė „CodedProfessionalContact“ yra savo ruožtu paveldima ...


„Public Class NotOverridableEx“. Paveldėjimas CodedProfessionalContact. 

... funkcijos HashTheName toje klasėje negalima perrašyti. Elementas, kurio negalima nepaisyti, kartais vadinamas sandariu elementu.

Pagrindinė .NET fondas yra reikalauti, kad kiekvienos klasės tikslas būtų aiškiai apibrėžtas, kad būtų pašalintas visas netikrumas. Ankstesnių OOP kalbų problema buvo vadinama „silpna pagrindine klase“. Tai atsitinka, kai bazė klasė prideda naują metodą tuo pačiu pavadinimu kaip metodo pavadinimą poklasyje, kuris paveldimas iš bazės klasė. Poklasį rašantis programuotojas neplanavo peržengti bazinės klasės, tačiau bet kokiu atveju būtent taip atsitinka. Buvo žinoma, kad tai sužeisto programuotojo šauksmas: „Aš nieko nepakeičiau, bet mano programa sudužo bet kokiu atveju. "Jei yra tikimybė, kad klasė ateityje bus atnaujinta ir sukurs šią problemą, paskelbkite ją kaip Neperžiūrimas.

„MustOverride“ dažniausiai naudojamas vadinamojoje abstrakčių klasėje. (C # tame pačiame tekste naudojamas raktinis žodis Anotacija!) Tai klasė, kurioje tik pateikiamas šablonas, ir jūs tikimasi, kad užpildysite jį savo kodu. „Microsoft“ pateikia šį pavyzdį:

Vieša „MustInherit“ klasės skalbimo mašina. Dalis naujo () „Čia pateikiamas klasės pagreitinimo kodas. Pabaigos poskyris. Viešas „MustOverride Sub“ prausiklis. Viešas „MustOverride“ skalavimas („loadSize as Integer“) Viešas „MustOverride“ funkcijos sukimasis (greitis kaip sveikasis) tiek ilgas. Pabaigos klasė.

Norėdami tęsti „Microsoft“ pavyzdį, skalbimo mašinos atliks šiuos dalykus (plauti, skalauti ir gręžti) gana skirtingai, todėl nėra privalumo apibrėžti pagrindinėje klasėje funkciją. Tačiau privalumas yra tai, kad užtikrinsite bet kurią klasę, kuri paveldės šią klasę daro juos apibrėžti. Sprendimas: abstrakti klasė.

Jei jums reikia dar daugiau paaiškinimų apie perkrovų ir nepaisymų skirtumus, greitame patarime pateikiamas visiškai kitoks pavyzdys: Perkrovos ir nepaisymai

VB.NET suteikia jums dar daugiau kontrolės, leisdami pagrindinei klasei konkrečiai reikalauti arba atmesti išvestinę klasę, kad ji būtų nepaisoma, naudojant pagrindinės klasės „MustOverride“ ir „NotOverridable“ raktinius žodžius. Bet abu šie atvejai naudojami gana specifiniais atvejais. Pirma, „NotOverrivable“.

Kadangi viešosios klasės numatytoji reikšmė yra Neperleidžiama, kodėl turėtumėte kada nors ją nurodyti? Jei išbandysite tai naudodami pagrindinės klasės funkciją „HashTheName“, gausite sintaksės klaidą, tačiau klaidos pranešimo tekstas nurodo:

Metodams, kurie nenusileidžia kitam metodui, negalima nurodyti „NotOverridable“.

Numatytoji reikšmė nepaisomajam metodui yra visiškai priešinga: Nepaisoma. Taigi, jei norite, kad viršesnis reikalavimas tikrai sustotų, turite nurodyti „NotOverridable“ tame metode. Mūsų pavyzdžio kode:


Viešas neperžiūrimas Nepaisoma Funkcija „HashTheName“ (... 

Tada, jei klasė „CodedProfessionalContact“ yra savo ruožtu paveldima ...


„Public Class NotOverridableEx“. Paveldėjimas CodedProfessionalContact. 

... funkcijos HashTheName toje klasėje negalima perrašyti. Elementas, kurio negalima nepaisyti, kartais vadinamas sandariu elementu.

Pagrindinė .NET fondo dalis yra reikalavimas, kad kiekvienos klasės tikslas būtų aiškiai apibrėžtas, kad būtų pašalintas visas netikrumas. Ankstesnių OOP kalbų problema buvo vadinama „silpna pagrindine klase“. Tai atsitinka, kai bazė klasė prideda naują metodą tuo pačiu pavadinimu kaip metodo pavadinimą poklasyje, kuris paveldimas iš bazės klasė. Poklasį rašantis programuotojas neplanavo peržengti bazinės klasės, tačiau bet kokiu atveju būtent taip atsitinka. Buvo žinoma, kad tai sužeisto programuotojo šauksmas: „Aš nieko nepakeičiau, bet mano programa sudužo bet kokiu atveju. "Jei yra tikimybė, kad klasė ateityje bus atnaujinta ir sukurs šią problemą, paskelbkite ją kaip Neperžiūrimas.

„MustOverride“ dažniausiai naudojamas vadinamojoje abstrakčių klasėje. (C # tame pačiame tekste naudojamas raktinis žodis Anotacija!) Tai klasė, kurioje tik pateikiamas šablonas, ir jūs tikimasi, kad užpildysite jį savo kodu. „Microsoft“ pateikia šį pavyzdį:

Vieša „MustInherit“ klasės skalbimo mašina. Dalis naujo () „Čia pateikiamas klasės pagreitinimo kodas. Pabaigos poskyris. Viešas „MustOverride Sub“ prausiklis. Viešas „MustOverride“ skalavimas („loadSize as Integer“) Viešas „MustOverride“ funkcijos sukimasis (greitis kaip sveikasis) tiek ilgas. Pabaigos klasė.

Norėdami tęsti „Microsoft“ pavyzdį, skalbimo mašinos atliks šiuos dalykus (plauti, skalauti ir gręžti) gana skirtingai, todėl nėra privalumo apibrėžti pagrindinėje klasėje funkciją. Tačiau privalumas yra tai, kad užtikrinsite bet kurią klasę, kuri paveldės šią klasę daro juos apibrėžti. Sprendimas: abstrakti klasė.

Jei jums reikia dar daugiau paaiškinimų apie perkrovų ir nepaisymų skirtumus, greitame patarime pateikiamas visiškai kitoks pavyzdys: Perkrovos ir nepaisymai

instagram story viewer