Ignorē vietni VB.NET

Šī ir viena no mini sērijām, kas aptver atšķirības starp pārslodzēm, ēnām un ignorēšanu VB.NET. Šis raksts attiecas uz ignorēšanu. Raksti, kas attiecas uz pārējiem, ir šeit:

-> pārslodzes
-> Ēnas

Šīs metodes var būt ļoti mulsinoši; ir ļoti daudz šo atslēgvārdu un to pamatā esošo mantojuma iespēju kombinācijas. Pati Microsoft dokumentācija par šo tēmu nesāk darboties taisnīgi, un tīmeklī ir ļoti daudz sliktas vai novecojušas informācijas. Labākais padoms, lai pārliecinātos, ka jūsu programma ir pareizi kodēta, ir “Pārbaudi, pārbaudi un vēlreiz pārbaudi”. Šajā sērijā mēs tos apskatīsim pa vienam, uzsverot atšķirības.

Pārrakstīšana

Ēnām, pārslodzēm un pārrakstījumiem ir kopīgs tas, ka viņi atkārtoti izmanto elementu nosaukumus, mainot notiekošo. Ēnas un pārslodzes var darboties gan vienā klasē, gan tad, ja a klase manto cita klase. Pārrakstīšanu tomēr var izmantot tikai atvasinātā klasē (dažreiz saukta par bērnu klasi), kas manto no a bāzes klase (dažreiz saukta par vecāku klasi). Un Overrides ir āmurs; tas ļauj pilnībā aizstāt metodi (vai īpašumu) no pamatklases.

instagram viewer

Rakstā par klasēm un atslēgvārdu Shadows (Sk. Ēnas VB.NET) tika pievienota funkcija, lai parādītu, ka var atsaukties uz iedzimtu procedūru.

Sabiedrības klases profesionālais kontakts. '... kods nav parādīts... Publiskā funkcija HashTheName ( ByVal nm kā stīga) kā stīga. Atgriešanās nm. GetHashCode. Beigu funkcija. Beigu klase.

Kods, kas no šī klases atvasina klasi (piemērā ir CodedProfessionalContact), var izsaukt šo metodi, jo tā ir iedzimta.

Piemērā es izmantoju VB.NET GetHashCode metode, lai saglabātu kodu vienkāršu, un tas atdeva diezgan bezjēdzīgu rezultātu, vērtība -520086483. Pieņemsim, ka es gribēju, lai tā vietā tiktu atgriezts cits rezultāts, bet,

-> Es nevaru mainīt bāzes klasi. (Varbūt viss, kas man ir, ir sastādīts pārdevēja kods.)

... un ...

-> Es nevaru mainīt izsaukuma kodu (Varbūt ir tūkstoš eksemplāru, un es tos nevaru atjaunināt.)

Ja es varu atjaunināt atvasināto klasi, tad es varu mainīt iegūto rezultātu. (Piemēram, kods varētu būt atjaunināma DLL daļa.)

Ir viena problēma. Tā kā tas ir tik visaptverošs un spēcīgs, lai izmantotu ignorēšanu, jums ir jābūt pamatklases atļaujai. Bet labi izstrādātas kodu bibliotēkas to nodrošina. (Jūsu kodu bibliotēkas visas ir labi izstrādātas, vai ne?) Piemēram, mūsu sniegtā Microsoft piedāvātā funkcija ir nepārvarama. Šeit ir sintakses piemērs.

Publiska, pārspīlēta funkcija GetHashCode kā vesels skaitlis

Tātad šim atslēgvārdam jābūt klāt arī mūsu bāzes klases paraugā.

Publiska, pārspīlēta funkcija HashTheName ( ByVal nm kā stīga) kā stīga.

Metodes ignorēšana tagad ir tikpat vienkārša kā jauna atslēgvārda nodrošināšana. Visual Studio atkal dod jums darbības sākumu, aizpildot jums paredzēto kodu ar automātisko pabeigšanu. Kad ievadāt ...


Sabiedrības ignorēšanas funkcija HashTheName (

Visual Studio automātiski pievieno pārējo kodu, tiklīdz jūs ierakstāt sākuma iekavu, ieskaitot atgriešanas paziņojumu, kas izsauc sākotnējo funkciju tikai no pamata klases. (Ja jūs tikai pievienojat kaut ko, tas parasti ir labi izdarāms pēc jūsu jaunā koda izpildīšanas.)

Sabiedrības ignorēšanas funkcija HashTheName ( nm kā stīga) kā stīga. Atgrieziet MyBase. HashTheName (nm) Beigu funkcija.

Tomēr šajā gadījumā es aizstāšu metodi ar kaut ko citu, kas ir tikpat bezjēdzīgs, tikai lai parādītu, kā tas tiek darīts: Funkcija VB.NET, kas apvērs virkni.

Sabiedrības ignorēšanas funkcija HashTheName ( nm kā stīga) kā stīga. Atgrieziet Microsoft. Visual Basic. StrReverse (nm) Beigu funkcija.

Tagad zvana kods iegūst pavisam citu rezultātu. (Salīdziniet ar rezultātu rakstā par ēnām.)


KontaktID: 246. Uzņēmuma nosaukums: Villain Defeaters, GmbH. Biznesa nosaukuma sajaukšana: HbmG, sretaefeD nialliV. 

Varat arī ignorēt rekvizītus. Pieņemsim, ka jūs nolēmāt, ka ContactID vērtības, kas lielākas par 123, netiks atļautas un tām pēc noklusējuma jābūt 111. Jūs varat vienkārši ignorēt īpašumu un mainīt to, kad īpašums tiek saglabāts:

Privāts _ContactID kā vesels skaitlis. Sabiedrība ignorē īpašuma ContactID kā veselu skaitli. Gūt. Atgriezties _ContactID. Beigt saņemt. Iestatīts (ByVal vērtība kā vesels skaitlis) Ja vērtība> 123 Tad. _ContactID = 111. Citur. _ContactID = vērtība. Beigt ja. Beigu komplekts. Beigu īpašums.

Tad tiek iegūts šāds rezultāts, kad tiek pārsūtīta lielāka vērtība:


KontaktID: 111. Uzņēmuma nosaukums: Damsel Rescuers, LTD. 

Starp citu, līdz šim piemēru kodā veseli skaitļi tiek dubultoti jaunajā apakšprogramma (Skat. Rakstu par ēnām), tāpēc vesels skaitlis 123 tiek mainīts uz 246 un pēc tam atkal mainīts uz 111.

VB.NET vēl vairāk ļauj jums kontrolēt, ļaujot pamatklasei īpaši pieprasīt vai liegt atvasinātai klasei ignorēt, izmantojot pamatklasē MustOverride un NotOverridable atslēgvārdus. Bet abus šos gadījumus izmanto diezgan specifiskos gadījumos. Pirmkārt, NotOverrivable.

Tā kā publiskās klases noklusējuma iestatījums nav Noņemams, kāpēc jums tas kādreiz būtu jāprecizē? Izmēģinot to ar bāzes klases funkciju HashTheName, tiek parādīta sintakses kļūda, taču kļūdas ziņojuma teksts sniedz norādi:

“NotOverrivable” nevar norādīt metodēm, kuras nepārsniedz citu metodi.

Noklusējuma metode pārspīlētai metodei ir tieši pretēja: Pārvarējama. Tātad, ja vēlaties, lai pārsniegšana noteikti apstātos, šajā metodē ir jānorāda NotOverridable. Mūsu koda kodā:


Publisks nav noņemams Pārrakstīšana Funkcija HashTheName (... 

Tad, ja klase CodedProfessionalContact, savukārt, ir iedzimta ...


Sabiedrības klase nav pārņemamaEx. Mantojumi CodedProfessionalContact. 

... funkciju HashTheName šajā klasē nevar ignorēt. Elementu, kuru nevar ignorēt, dažreiz sauc par aizzīmogotu elementu.

Galvenā .NET fonds ir prasība skaidri definēt katras klases mērķi, lai novērstu visas nenoteiktības. Problēma iepriekšējās OOP valodās tika saukta par “trauslo bāzes klasi”. Tas notiek, ja bāze klase pievieno jaunu metodi ar tādu pašu nosaukumu kā metodes nosaukumam apakšklasē, kas tiek mantota no bāzes klase. Programmētājs, kurš raksta apakšklasi, neplānoja pārspēt bāzes klasi, taču tieši tā tas notiek. Ir zināms, ka tas izraisa ievainotā programmētāja saucienu: "Es neko nemainīju, bet mana programma avarēja anyway. "Ja pastāv iespēja, ka nākotnē kāda klase tiks atjaunināta un radīs šo problēmu, pasludiniet to par Nav pārņemams.

MustOverride visbiežāk tiek izmantots tā sauktajā abstraktajā klasē. (C # versijā tas pats lieto atslēgvārdu Abstract!) Šī ir klase, kas vienkārši nodrošina veidni, un jūs, domājams, aizpildīsit to ar savu kodu. Microsoft sniedz šo viena piemēra piemēru:

Publiskā MustInherit klases veļasmašīna. Sub jauns () Šeit tiek parādīts kods, kas veicina klases novirzīšanu. Beigt apakš. Publiskā MustOverride Sub mazgāšana. Publiskā MustOverride sub-skalošana (loadSize as Integer) Publiskās MustOverride funkcijas griešanās (ātrums kā vesels skaitlis) tik garš. Beigu klase.

Turpinot Microsoft piemēru, veļas mazgājamās mašīnas šīs lietas (mazgā, skalo un centrifugē) darīs diezgan atšķirīgi, tāpēc funkcijas noteikšanai pamata klasē nav nekādu priekšrocību. Bet ir priekšrocība pārliecināties, ka jebkura klase, kas manto šo klasi dara definējiet tos. Risinājums: abstrakta klase.

Ja jums ir nepieciešams vēl vairāk skaidrojumu par atšķirībām starp pārslodzēm un pārspīlējumiem, ātrajā padomā ir izstrādāts pilnīgi atšķirīgs piemērs: Pārslodzes pret versijām

VB.NET sniedz jums vēl lielāku kontroli, ļaujot pamatklasei īpaši pieprasīt vai liegt atvasinātai klasei ignorēt, izmantojot pamata klasē esošos atslēgvārdus MustOverride un NotOverridable. Bet abus šos gadījumus izmanto diezgan specifiskos gadījumos. Pirmkārt, NotOverrivable.

Tā kā publiskās klases noklusējuma iestatījums nav Noņemams, kāpēc jums tas kādreiz būtu jāprecizē? Izmēģinot to ar bāzes klases funkciju HashTheName, tiek parādīta sintakses kļūda, taču kļūdas ziņojuma teksts sniedz norādi:

“NotOverrivable” nevar norādīt metodēm, kuras nepārsniedz citu metodi.

Noklusējuma metode pārspīlētai metodei ir tieši pretēja: Pārvarējama. Tātad, ja vēlaties, lai pārsniegšana noteikti apstātos, šajā metodē ir jānorāda NotOverridable. Mūsu koda kodā:


Publisks nav noņemams Pārrakstīšana Funkcija HashTheName (... 

Tad, ja klase CodedProfessionalContact, savukārt, ir iedzimta ...


Sabiedrības klase nav pārņemamaEx. Mantojumi CodedProfessionalContact. 

... funkciju HashTheName šajā klasē nevar ignorēt. Elementu, kuru nevar ignorēt, dažreiz sauc par aizzīmogotu elementu.

.NET fonda būtiska sastāvdaļa ir pieprasīt, lai katras klases mērķis būtu precīzi definēts, lai noņemtu visas neskaidrības. Problēma iepriekšējās OOP valodās tika saukta par “trauslo bāzes klasi”. Tas notiek, ja bāze klase pievieno jaunu metodi ar tādu pašu nosaukumu kā metodes nosaukumam apakšklasē, kas tiek mantota no bāzes klase. Programmētājs, kurš raksta apakšklasi, neplānoja pārspēt bāzes klasi, taču tieši tā tas notiek. Ir zināms, ka tas izraisa ievainotā programmētāja saucienu: "Es neko nemainīju, bet mana programma avarēja anyway. "Ja pastāv iespēja, ka nākotnē kāda klase tiks atjaunināta un radīs šo problēmu, pasludiniet to par Nav pārņemams.

MustOverride visbiežāk tiek izmantots tā sauktajā abstraktajā klasē. (C # versijā tas pats lieto atslēgvārdu Abstract!) Šī ir klase, kas vienkārši nodrošina veidni, un jūs, domājams, aizpildīsit to ar savu kodu. Microsoft sniedz šo viena piemēra piemēru:

Publiskā MustInherit klases veļasmašīna. Sub jauns () Šeit tiek parādīts kods, kas veicina klases novirzīšanu. Beigt apakš. Publiskā MustOverride Sub mazgāšana. Publiskā MustOverride sub-skalošana (loadSize as Integer) Publiskās MustOverride funkcijas griešanās (ātrums kā vesels skaitlis) tik garš. Beigu klase.

Turpinot Microsoft piemēru, veļas mazgājamās mašīnas šīs lietas (mazgā, skalo un centrifugē) darīs diezgan atšķirīgi, tāpēc funkcijas noteikšanai pamata klasē nav nekādu priekšrocību. Bet ir priekšrocība pārliecināties, ka jebkura klase, kas manto šo klasi dara definējiet tos. Risinājums: abstrakta klase.

Ja jums ir nepieciešams vēl vairāk skaidrojumu par atšķirībām starp pārslodzēm un pārspīlējumiem, ātrajā padomā ir izstrādāts pilnīgi atšķirīgs piemērs: Pārslodzes pret versijām

instagram story viewer