To je ena izmed mini serij, ki zajema razlike v preobremenitvah, sencah in preglasitvah v VB.NET. Ta članek zajema preglasitve. Članki, ki pokrivajo druge, so tukaj:
-> Preobremenitve
-> Sence
Te tehnike je lahko zelo zmedeno; obstaja veliko kombinacij teh ključnih besed in osnovnih možnosti dedovanja. Microsoftova lastna dokumentacija te teme ne začne obravnavati pravično in v spletu je veliko slabih ali zastarelih informacij. Najboljši nasvet, da se prepričate, da je vaš program pravilno kodiran, je: "Preizkusite, preizkusite in preizkusite znova." V tej seriji si jih bomo ogledali drug za drugim s poudarkom na razlikah.
Prevlada
Vse, kar imajo Shadows, Overloads in Overrides, je, da ime elementov ponovno uporabijo, medtem ko spremenijo, kaj se zgodi. Sence in preobremenitve lahko delujejo v istem razredu ali ko razred podeduje drug razred. Preglasitve pa se lahko uporabljajo le v izpeljanem razredu (včasih ga imenujejo tudi otroški razred), ki podeduje od a osnovni razred (včasih se imenuje nadrejeni razred). In Overrides je kladivo; omogoča vam, da v celoti zamenjate metodo (ali lastnost) iz osnovnega razreda.
V članku o razredih in ključni besedi Shadows (glej: Sence v VB.NET) je bila dodana funkcija, ki kaže, da se lahko sklicuje na podedovani postopek.
Public Class ProfessionalContact. '... koda ni prikazana... Javna funkcija HashTheName ( ByVal nm As String) Kot niz. Vrnitev nm. GetHashCode. Končna funkcija Končni razred.
Koda, ki ustvarja razred iz tega (CodedProfessionalContact v primeru), lahko to metodo pokliče, ker je podedovana.
V primeru sem uporabil VB.NET GetHashCode način, kako kodo ohraniti preprosto, kar je vrnilo dokaj neuporaben rezultat, vrednost -520086483. Recimo, da sem namesto tega želel vrniti drugačen rezultat,
-> Ne morem spremeniti osnovnega razreda. (Mogoče je vse, kar imam, sestavljena koda od prodajalca.)
... in ...
-> Ne morem spremeniti klicne kode (morda je na tisoče kopij in jih ne morem posodobiti.)
Če lahko posodobim izpeljani razred, lahko spremenim vrnjeni rezultat. (Na primer, koda je lahko del posodobljivega DLL-ja.)
Obstaja ena težava. Ker je tako obsežen in močan, morate imeti dovoljenje osnovnega razreda, da uporabljate Overrides. Toda dobro zasnovane knjižnice kod to zagotavljajo. (Vaš knjižnice kode so vse dobro oblikovane, kajne?) Na primer, Microsoftova funkcija, ki smo jo pravkar uporabili, je nadomestljiva. Tu je primer skladnje.
Javna funkcija za prepisovanje GetHashCode kot celoten
Tako mora biti ključna beseda prisotna tudi v našem primernem osnovnem razredu.
Javna prenašalna funkcija HashTheName ( ByVal nm As String) Kot niz.
Prevlada metoda je zdaj tako preprosta kot zagotavljanje novega s ključno besedo Overrides. Visual Studio znova zažene začetek, tako da izpolnite kodo s samodejnim dokončanjem. Ko vnesete ...
Javno preglasi funkcijo HashTheName (
Visual Studio samodejno doda preostalo kodo takoj, ko vtipkate otvoritvene oklepaje, vključno s povratnim stavkom, ki samo iz osnovnega razreda pokliče prvotno funkcijo. (Če samo dodajate nekaj, je to običajno dobro storiti, potem ko se nova koda vseeno izvrši.)
Javno preglasi funkcijo HashTheName ( nm kot niz) kot niz. Vrni MyBase. HashTheName (nm) Končna funkcija
V tem primeru pa bom metodo nadomestil z nečim drugim enako neuporabnim, samo da ponazorim, kako je to storjeno: funkcija VB.NET, ki bo niz vrnila v obrat.
Javno preglasi funkcijo HashTheName ( nm kot niz) kot niz. Vrnite Microsoft. Visual basic. StrReverse (nm) Končna funkcija
Zdaj klicna koda dobi popolnoma drugačen rezultat. (Primerjajte z rezultatom v članku o Sencah.)
KontaktID: 246. Ime podjetja: Villain Defeaters, GmbH. Hash of the BusinessName: HbmG, sretaefeD nialliV.
Prav tako lahko prekašate lastnosti. Recimo, da ste se odločili, da vrednosti ContactID, večje od 123, ne bodo dovoljene in bi morale biti privzete na 111. Lastnost lahko preprosto preglasite in jo spremenite, ko je lastnost shranjena:
Zasebni _ContactID Kot celoten. Javno preglasi lastnino ContactID kot celoten. Pridite. Vrnite _ContactID. Končaj Get. Nastavi (vrednost ByVal kot celo število) Če je vrednost> 123 Potem. _ContactID = 111. Ostalo. _ContactID = vrednost. Konec Če. Končni niz Končna lastnost.
Nato dobite ta rezultat, ko se prenese večja vrednost:
ContactID: 111. Ime podjetja: Damsel Rescuers, LTD.
Mimogrede, v dosedanjem primeru kode so v Novi podvojeni celoštevilčne vrednosti podprogram (Glejte članek o sencah), tako da se celo število 123 spremeni v 246 in nato ponovno spremeni v 111.
VB.NET vam omogoča še več nadzora, tako da dovoljuje osnovnemu razredu, da posebej zahteva ali zavrne izpeljani razred za preglasitev z uporabo ključnih besed MustOverride in NotOverridable v osnovnem razredu. Toda oboje se uporablja v dokaj specifičnih primerih. Prvič, NotOverridable.
Ker je privzeti javni razred NotOverridable, zakaj bi ga sploh morali določiti? Če preizkusite v funkciji HashTheName v osnovnem razredu, dobite napako skladnje, vendar besedilo sporočila o napaki daje namig:
'NotOverridable' ni mogoče določiti za metode, ki ne preglasijo druge metode.
Privzeta metoda za preglasitev je ravno obratna: Overrideable. Če torej želite, da se preglasitev zagotovo ustavi, morate na tej metodi določiti NotOverridable. V našem primeru koda:
Javno NotOverridable Prevlada Funkcija HashTheName (...
Potem, če je razred CodedProfessionalContact podedovan ...
Javni razred NotOverridableEx. Dedinje CodedProfessionalContact.
... funkcije HashTheName v tem razredu ni mogoče preglasiti Element, ki ga ni mogoče preglasiti, včasih imenujemo zapečaten element.
Temeljni del the.Fundacija NET je zahtevati, da je namen vsakega razreda izrecno opredeljen, da se odstrani vsa negotovost. Težava v prejšnjih jezikih OOP se imenuje "krhki osnovni razred." To se zgodi, ko baza class doda novo metodo z istim imenom kot ime metode v podrazredu, ki podeduje od osnove razred. Programer, ki je napisal podrazred, ni načrtoval preglasitve osnovnega razreda, vendar se to vseeno zgodi. To je znano, da je povzročil jok ranjenega programerja: "Nisem ničesar spremenil, ampak moj program se je zrušil vseeno. "Če obstaja možnost, da se bo razred v prihodnosti posodobil in ustvaril to težavo, ga prijavite kot NotOverridable.
MustOverride se najpogosteje uporablja v tistem, kar se imenuje abstraktni razred. (V C # ista stvar uporablja ključno besedo Izvleček!) To je razred, ki ponuja samo predlogo in jo boste morali napolniti s svojo kodo. Microsoft ponuja ta primer enega:
Javni stroj za pranje perila MustInherit. Pod novo () "Koda za uveljavitev razreda gre tukaj. Končni pod. Javno MustOverride Sub Wash. Javno MustOverride Sub Rinse (loadSize as Integer) Funkcija Spin Public MustOverride (hitrost kot celost) kot dolga. Končni razred.
Če želite nadaljevati z Microsoftovim primerom, bodo pralni stroji naredili te stvari (Pranje, Izpiranje in Vijačenje) povsem drugače, tako da ni prednosti definiranja funkcije v osnovnem razredu. Ampak obstaja prednost pri zagotavljanju, da kateri koli razred, ki podeduje ta razred naredi jih določite. Rešitev: abstraktni razred.
Če potrebujete še več razlage o razlikah med preobremenitvami in preglasitvami, je v kratkem nasvetu razvit popolnoma drugačen primer: preobremenitve v primerjavi s preglasitvami
VB.NET vam omogoča še večji nadzor, saj dovoljuje osnovnemu razredu, da posebej zahteva ali zavrne izpeljani razred, da ga preglasi s pomočjo ključnih besed MustOverride in NotOverridable v osnovnem razredu. Toda oboje se uporablja v dokaj specifičnih primerih. Prvič, NotOverridable.
Ker je privzeti javni razred NotOverridable, zakaj bi ga sploh morali določiti? Če preizkusite v funkciji HashTheName v osnovnem razredu, dobite napako skladnje, vendar besedilo sporočila o napaki daje namig:
'NotOverridable' ni mogoče določiti za metode, ki ne preglasijo druge metode.
Privzeta metoda za preglasitev je ravno obratna: Overrideable. Če torej želite, da se preglasitev zagotovo ustavi, morate na tej metodi določiti NotOverridable. V našem primeru koda:
Javno NotOverridable Prevlada Funkcija HashTheName (...
Potem, če je razred CodedProfessionalContact podedovan ...
Javni razred NotOverridableEx. Dedinje CodedProfessionalContact.
... funkcije HashTheName v tem razredu ni mogoče preglasiti Element, ki ga ni mogoče preglasiti, včasih imenujemo zapečaten element.
Temeljni del fundacije .NET je zahtevati, da je namen vsakega razreda izrecno opredeljen, da se odstrani vsa negotovost. Težava v prejšnjih jezikih OOP se imenuje "krhki osnovni razred." To se zgodi, ko baza class doda novo metodo z istim imenom kot ime metode v podrazredu, ki podeduje od osnove razred. Programer, ki je napisal podrazred, ni načrtoval preglasitve osnovnega razreda, vendar se to vseeno zgodi. To je znano, da je povzročil jok ranjenega programerja: "Nisem ničesar spremenil, ampak moj program se je zrušil vseeno. "Če obstaja možnost, da se bo razred v prihodnosti posodobil in ustvaril to težavo, ga prijavite kot NotOverridable.
MustOverride se najpogosteje uporablja v tistem, kar se imenuje abstraktni razred. (V C # ista stvar uporablja ključno besedo Izvleček!) To je razred, ki ponuja samo predlogo in jo boste morali napolniti s svojo kodo. Microsoft ponuja ta primer enega:
Javni stroj za pranje perila MustInherit. Pod novo () "Koda za uveljavitev razreda gre tukaj. Končni pod. Javno MustOverride Sub Wash. Javno MustOverride Sub Rinse (loadSize as Integer) Funkcija Spin Public MustOverride (hitrost kot celost) kot dolga. Končni razred.
Če želite nadaljevati z Microsoftovim primerom, bodo pralni stroji naredili te stvari (Pranje, Izpiranje in Vijačenje) povsem drugače, tako da ni prednosti definiranja funkcije v osnovnem razredu. Ampak obstaja prednost pri zagotavljanju, da kateri koli razred, ki podeduje ta razred naredi jih določite. Rešitev: abstraktni razred.
Če potrebujete še več razlage o razlikah med preobremenitvami in preglasitvami, je v kratkem nasvetu razvit popolnoma drugačen primer: preobremenitve v primerjavi s preglasitvami