Įdomus

Nepaisoma VB.NET

Nepaisoma VB.NET



We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

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

-> perkrovos
-> Šešėliai

Šie metodai gali būti labai painūs; 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 labai 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 tada, kai klasė paveldi kitą klasę. Tačiau nepaisymai gali būti naudojami tik išvestinėje klasėje (kartais vadinamoje vaikų klase), kuri paveldima iš pagrindinės klasės (kartais vadinamos tėvų klase). O nepaisymas yra plaktukas; tai leidžia visiškai pakeisti metodą (arba savybę) iš bazinės klasės.

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 eilutė) kaip eilutės grįžimo vertė nm.GetHashCode Pabaiga Funkcija Pabaigos klasė

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

Pavyzdyje naudojau metodą „VB.NET GetHashCode“, kad kodas būtų paprastas, ir tai grąžino gana nenaudingą rezultatą, 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 pagrindinės klasės leidimą naudoti nepaisymus. Bet gerai suplanuotos kodų bibliotekos tai teikia. (Tavo kodų bibliotekos visos yra gerai suprojektuotos, tiesa?) Pavyzdžiui, ką tik panaudota „Microsoft“ funkcija yra nenugalima. Štai sintaksės pavyzdys.

Vieša neperduodama funkcija „GetHashCode“ 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

Dabar pakeisti metodą yra taip paprasta, kaip pateikti naują su raktiniu žodžiu Nepaisyti. „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 skliaustelius, įskaitant grąžinimo teiginį, kuris iš pagrindinės klasės iškviečia tik pradinę funkciją. (Jei ką tik pridedate, paprastai tai reikia padaryti po to, kai jūsų naujasis kodas bus vykdomas.)

Viešas nepaisymas „HashTheName“ (nm kaip eilutė) kaip eilutė Grąžina „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“ (nm kaip eilutė) kaip eilutė Grįžta „Microsoft.VisualBasic.StrReverse“ (nm) Pabaigos funkcija

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

Kontaktinis ID: 246 Verslo vardas: Villain Defeaters, GmbH Verslo vardo paslėpimas: 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 ją pakeisti, kai nuosavybė išsaugoma:

Privatus _ContactID, kaip sveikas skaičius, nepaiso nuosavybės ContactID, kaip sveiko skaičiaus. Gauna grąžą.

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

Kontaktinis ID: 111 „BusinessName“: „Damsel Rescuers, LTD“

Beje, kol kas pavyzdyje kodo sveikojo skaičiaus reikšmės dvigubos naujojoje paprogramėje (žr. Straipsnį apie šešėlius), taigi 123 sveikasis skaičius keičiamas į 246, o paskui 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ų kodo pavyzdyje:

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

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

„Public Class NotOverrivableEx Inherits CodedProfessionalContact“

… Toje klasėje negalima perrašyti funkcijos „HashTheName“. 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 bazine klase“. Tai atsitinka, kai bazinė klasė prideda naują metodą tuo pačiu pavadinimu kaip metodo pavadinimą poklasyje, kuris paveldimas iš pagrindinės klasės. Poklasį rašantis programuotojas neplanavo peržengti bazinės klasės, tačiau būtent taip nutinka. Žinoma, kad dėl to sužeistas programuotojas sušuko: „Aš nieko nepakeičiau, bet mano programa bet kokiu atveju sudužo“. Jei yra tikimybė, kad klasė ateityje bus atnaujinta ir sukurs šią problemą, paskelbkite ją „NotOverrivable“.

„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į:

Čia pateiktas viešas „MustInherit“ klasės skalbimo mašinos subnacionalinis () kodas, skirtas klasės paspartinimui. Pabaigos viešas „MustOverride“ antrinis plovimas „MustOverride“ antrinis skalavimas („loadSize as Integer“) „Public MustOverride“ funkcijos sukimas (greitis kaip sveikasis skaičius) kaip „Long End Class“

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 kitas pavyzdys: Perkrovos ir nepaisymai

VB.NET suteikia jums dar daugiau kontrolės, leisdama 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ų kodo pavyzdyje:

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

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

„Public Class NotOverrivableEx Inherits CodedProfessionalContact“

… Toje klasėje negalima perrašyti funkcijos „HashTheName“. 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 bazine klase“. Tai atsitinka, kai bazinė klasė prideda naują metodą tuo pačiu pavadinimu kaip metodo pavadinimą poklasyje, kuris paveldimas iš pagrindinės klasės. Poklasį rašantis programuotojas neplanavo peržengti bazinės klasės, tačiau būtent taip nutinka. Buvo žinoma, kad tai sužeisto programuotojo šauksmas: „Aš nieko nepakeičiau, bet mano programa bet kokiu atveju sudužo“. Jei yra tikimybė, kad klasė ateityje bus atnaujinta ir sukurs šią problemą, paskelbkite ją NotOverrivable.

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

Čia pateikiamas viešas „MustInherit“ klasės skalbimo mašinos subnacionalinis () kodas, skirtas klasės paspartinimui. Pabaigos viešas „MustOverride“ antrinis plovimas „MustOverride“ vidurinis skalavimas („loadSize as Integer“) „Public MustOverride“ funkcijos sukimas (greitis kaip sveikasis skaičius) kaip „Long End Class“

Norėdami tęsti „Microsoft“ pavyzdį, skalbimo mašinos atliks šiuos dalykus (plauti, skalauti ir gręžti) gana skirtingai, todėl nėra jokios naudos 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 kitas pavyzdys: Perkrovos ir nepaisymai


Žiūrėti video įrašą: A New War With Old Generals Carnage on the Western Front I THE GREAT WAR - Week 4 (Rugpjūtis 2022).