Poništavanja u VB.NET

click fraud protection

Ovo je jedna od mini serija koje pokrivaju razlike u Preopterećenjima, Sjenama i Prekoračenjima u sustavu VB.NET. Ovaj članak pokriva poništavanja. Članci koji pokrivaju ostale su ovdje:

-> Preopterećenja
-> Sjene

Ove tehnike može biti vrlo zbunjujuće; postoji puno kombinacija ovih ključnih riječi i osnovnih mogućnosti nasljeđivanja. Microsoftova vlastita dokumentacija ne čini pravdu o temi i na internetu ima puno loših ili zastarjelih podataka. Najbolji savjet da budete sigurni da je vaš program ispravno kodiran jest: "Ispitajte, testirajte i testirajte ponovo." U ovoj ćemo se seriji posmatrati jednu po jednu s naglaskom na razlike.

Zaobilazi

Ono što zajedničkim slovima ima Shadows, Overloads i Overrides je da ponovo koriste naziv elemenata dok mijenjaju ono što se događa. Sjene i preopterećenja mogu raditi i unutar iste klase ili kada su a klasa nasljeđuje drugu klasu. Poništavanja se, međutim, mogu upotrebljavati samo u izvedenom razredu (koji se ponekad naziva i dječja klasa) koji nasljeđuje od a

instagram viewer
osnovna klasa (ponekad se naziva roditeljska klasa). A Overrides je čekić; omogućuje vam da u potpunosti zamijenite metodu (ili svojstvo) iz osnovne klase.

U članku o klasama i ključnoj riječi Shadows (vidi: Shadows u VB.NET) dodana je funkcija koja pokazuje da se na naslijeđeni postupak može uputiti.

Public Class ProfessionalContact. '... kôd nije prikazan... Javna funkcija HashTheName ( ByVal nm kao string) Kao gudački. Povratak nm. GetHashCode. Završna funkcija. Krajnja klasa.

Kôd koji inicira klasu izvedenu iz ove (CodedProfessionalContact u primjeru) može nazvati ovu metodu jer je naslijeđena.

U primjeru sam koristio VB.NET GetHashCode metodu za jednostavno čuvanje koda, a to je vratilo prilično beskoristan rezultat, vrijednost -520086483. Pretpostavimo da sam umjesto toga vratio drugačiji rezultat,

-> Ne mogu promijeniti osnovnu klasu. (Možda je sve što imam je komponiran kod dobavljača.)

... i ...

-> Ne mogu promijeniti pozivni kôd (možda postoji tisuću primjeraka i ne mogu ih ažurirati.)

Ako mogu ažurirati izvedenu klasu, tada mogu promijeniti vraćeni rezultat. (Na primjer, kôd bi mogao biti dio DLL-a za nadogradnju.)

Postoji jedan problem. Budući da je tako sveobuhvatan i moćan, morate imati dopuštenje od osnovne klase da biste mogli koristiti Overrides. Ali dobro dizajnirane biblioteke koda to pružaju. (vaš biblioteke koda su sve dobro dizajnirane, zar ne?) Na primjer, Microsoftova funkcija koju smo upravo koristili može se nadgledati. Evo primjera sintakse.

Javna funkcija za nadmetanje GetHashCode kao cijeli broj

Dakle, ta ključna riječ mora biti prisutna i u našem primjeru osnovne klase.

Javna zamjenska funkcija HashTheName ( ByVal nm kao string) Kao gudački.

Nadjačavanje metode sada je jednostavno kao i pružanje novog s ključnom riječi Overrides. Visual Studio opet vam pokreće početak ispunjavanjem koda za vas pomoću automatskog dovršavanja. Kad uđete ...


Javna poništavanja funkcije HashTheName (

Visual Studio automatski dodaje ostatak koda čim upišete zagradne zagrade, uključujući i izjavu povratka koja samo iz izvorne funkcije poziva iz osnovne klase. (Ako samo nešto dodajete, to je obično dobro učiniti nakon što se novi kôd svejedno izvrši.)

Javna poništavanja funkcije HashTheName ( nm kao string) Kao gudački. Vrati MyBase. HashTheName (nm) Završna funkcija.

U ovom slučaju, međutim, zamijenit ću metodu nečim drugim jednako beskorisnim samo da ilustriram kako se to radi: VB.NET funkcija koja će preokrenuti niz.

Javna poništavanja funkcije HashTheName ( nm kao string) Kao gudački. Vratite Microsoft. Visual Basic. StrReverse (nm) Završna funkcija.

Sada pozivni kôd dobiva potpuno drugačiji rezultat. (Usporedite s rezultatom u članku o Sjenama.)


KontaktID: 246. BusinessName: Villain Defeaters, GmbH. Hash of the BusinessName: HbmG, sretaefeD nialliV. 

Možete nadjačati i svojstva. Pretpostavimo da ste odlučili da ContactID vrijednosti veće od 123 neće biti dopuštene i trebale bi biti zadane na 111. Možete jednostavno nadjačati svojstvo i promijeniti ga kada se entitet spremi:

Privatni _ContactID kao Integer. Javno nadgleda imovinu ContactID kao cijeli broj. Dobiti. Vratite _ContactID. Kraj Get. Postavi (ByVal vrijednost kao Integer) Ako je vrijednost> 123 Tada. _ContactID = 111. Drugo. _ContactID = vrijednost. Završi ako. Završni skup. Kraj imovine.

Tada taj rezultat dobivate kada se prenese veća vrijednost:


KontaktID: 111. BusinessName: Spasioci na osami, LTD. 

Usput, u dosadašnjem primjeru koda, u Novom se udvostručuju cjelobrojne vrijednosti podrutina (Pogledajte članak o Sjenama), pa se cijeli broj 123 mijenja u 246, a zatim ponovno mijenja u 111.

VB.NET vam daje, još više, kontrolu dopuštajući osnovnoj klasi da posebno zahtijeva ili negira izvedenu klasu da nadjača koristeći MustOverride i NotOverridable ključne riječi u osnovnoj klasi. Ali i jedno i drugo koristi se u prilično specifičnim slučajevima. Prvo, NotOverridable.

Budući da je zadana postavka za javnu klasu NotOverridable, zašto biste je ikada trebali specificirati? Ako ga isprobate na funkciji HashTheName u osnovnoj klasi, dobit ćete sintaksičku grešku, ali tekst poruke o pogrešci daje vam pojma:

'NotOverridable' se ne može odrediti za metode koje ne nadjačavaju drugu metodu.

Zadana postavka za poništenu metodu je upravo suprotno: Overrideable. Dakle, ako želite da se prekoračenje definitivno zaustavi, morate navesti metodu NotOverridable na toj metodi. U našem primjeru koda:


Javno NotOverridable Zaobilazi Funkcija HashTheName (... 

Onda ako je klasa CodedProfessionalContact zauzvrat naslijeđena ...


Javna klasa NotOverridableEx. Nasljedice CodedProfessionalContact. 

... funkcija HashTheName se ne može nadjačati u toj klasi. Element koji se ne može nadjačati ponekad se naziva i zapečaćenim elementom.

Temeljni dio the.Zaklada NET je zahtijevati da je svrha svake klase izričito definirana kako bi se uklonila sva nesigurnost. Problem u prethodnim OOP jezicima nazvan je "krhka osnovna klasa." To se događa kada je baza klasa dodaje novu metodu s istim imenom kao i naziv metode u potklasi koja nasljeđuje od baze klase. Programer koji piše podklasu nije planirao prevladavanje osnovne klase, ali upravo se to događa. To je znalo da rezultira krikom ranjenog programera, "Nisam ništa promijenio, ali moj se program srušio svejedno. "Ako postoji mogućnost da će se klasa ubuduće ažurirati i stvoriti taj problem, prijavite to kao NotOverridable.

MustOverride se najčešće koristi u onome što se naziva apstraktna klasa. (U C #, ista stvar upotrebljava ključnu riječ Sažetak!) Ovo je klasa koja pruža samo predložak i od vas se očekuje da ga napunite vlastitim kodom. Microsoft daje ovaj primjer jednog:

Javna perilica rublja klase MustInherit. Pod novo () 'Ovdje se nalazi šifra za instanciju klase. Kraj pod. Javno MustOverride Sub Wash. Javno MustOverride sub ispiranje (loadSize as Integer) Javna funkcija MustOverride (okretna brzina kao cijeli) kao duga. Krajnja klasa.

Za nastavak Microsoftovog primjera, perilice rublja će ove stvari (oprati, isprati i vrtjeti) sasvim drugačije, tako da nema prednosti definiranja funkcije u osnovnoj klasi. Ali postoji prednost u osiguravanju bilo koje klase koja nasljeđuje ovu se definirajte ih. Rješenje: apstraktna klasa.

Ako vam treba još više objašnjenja o razlikama između preopterećenja i poništenja, u kratkom savjetu razvijen je potpuno drugačiji primjer: preopterećenja u odnosu na poništavanja

VB.NET vam daje još veću kontrolu dopuštajući osnovnoj klasi da posebno zahtijeva ili negira izvedenu klasu da nadjača koristeći ključne riječi MustOverride i NotOverridable u osnovnoj klasi. Ali i jedno i drugo koristi se u prilično specifičnim slučajevima. Prvo, NotOverridable.

Budući da je zadana postavka za javnu klasu NotOverridable, zašto biste je ikada trebali specificirati? Ako ga isprobate na funkciji HashTheName u osnovnoj klasi, dobit ćete sintaksičku grešku, ali tekst poruke o pogrešci daje vam pojma:

'NotOverridable' se ne može odrediti za metode koje ne nadjačavaju drugu metodu.

Zadana postavka za poništenu metodu je upravo suprotno: Overrideable. Dakle, ako želite da se prekoračenje definitivno zaustavi, morate navesti metodu NotOverridable na toj metodi. U našem primjeru koda:


Javno NotOverridable Zaobilazi Funkcija HashTheName (... 

Onda ako je klasa CodedProfessionalContact zauzvrat naslijeđena ...


Javna klasa NotOverridableEx. Nasljedice CodedProfessionalContact. 

... funkcija HashTheName se ne može nadjačati u toj klasi. Element koji se ne može nadjačati ponekad se naziva i zapečaćenim elementom.

Temeljni dio .NET Foundation jest zahtijevati da je svrha svake klase izričito definirana kako bi se uklonila sva nesigurnost. Problem u prethodnim OOP jezicima nazvan je "krhka osnovna klasa." To se događa kada je baza klasa dodaje novu metodu s istim imenom kao i naziv metode u potklasi koja nasljeđuje od baze klase. Programer koji piše podklasu nije planirao prevladavanje osnovne klase, ali upravo se to događa. To je znalo da rezultira krikom ranjenog programera, "Nisam ništa promijenio, ali moj se program srušio svejedno. "Ako postoji mogućnost da će se klasa ubuduće ažurirati i stvoriti taj problem, prijavite to kao NotOverridable.

MustOverride se najčešće koristi u onome što se naziva apstraktna klasa. (U C #, ista stvar upotrebljava ključnu riječ Sažetak!) Ovo je klasa koja pruža samo predložak i od vas se očekuje da ga napunite vlastitim kodom. Microsoft daje ovaj primjer jednog:

Javna perilica rublja klase MustInherit. Pod novo () 'Ovdje se nalazi šifra za instanciju klase. Kraj pod. Javno MustOverride Sub Wash. Javno MustOverride sub ispiranje (loadSize as Integer) Javna funkcija MustOverride (okretna brzina kao cijeli) kao duga. Krajnja klasa.

Za nastavak Microsoftovog primjera, perilice rublja će ove stvari (oprati, isprati i vrtjeti) sasvim drugačije, tako da nema prednosti definiranja funkcije u osnovnoj klasi. Ali postoji prednost u osiguravanju bilo koje klase koja nasljeđuje ovu se definirajte ih. Rješenje: apstraktna klasa.

Ako vam treba još više objašnjenja o razlikama između preopterećenja i poništenja, u kratkom savjetu razvijen je potpuno drugačiji primjer: preopterećenja u odnosu na poništavanja

instagram story viewer