Înlocuiește VB.NET

click fraud protection

Aceasta este una dintre mini-serii care acoperă diferențele de supraîncărcare, umbră și înlocuire VB.NET. Acest articol include Anulări. Articolele care acoperă celelalte sunt aici:

-> Supraîncărcări
-> Umbre

Aceste tehnici poate fi extrem de confuz; există o mulțime de combinații ale acestor cuvinte cheie și opțiunile de moștenire de bază. Documentația Microsoft nu începe să facă justiția subiectului și există o mulțime de informații proaste sau depășite pe web. Cel mai bun sfat pentru a vă asigura că programul dvs. este codat corect este „Testare, testare și testare din nou”. În această serie, le vom privi pe rând, cu accent pe diferențe.

Înlocuiri

Lucrul pe care Shadows, Overloads și Overrides îl au în comun este acela că refolosesc numele elementelor în timp ce schimbă ceea ce se întâmplă. Umbrele și supraîncărcările pot funcționa atât în ​​cadrul aceleiași clase, fie când moștenirea clasei o altă clasă. Însă, suprasolicitările pot fi utilizate doar într-o clasă derivată (numită uneori clasă copil) care moștenește de la o

instagram viewer
clasa de bază (uneori numit clasa părintească). Și Anulează este ciocanul; vă permite să înlocuiți în totalitate o metodă (sau o proprietate) dintr-o clasă de bază.

În articolul despre clase și cuvântul cheie Shadows (a se vedea: Shadows în VB.NET), a fost adăugată o funcție care arată că o procedură moștenită poate fi făcută referință.

Public Class ProfessionalContact. '... cod neafisat... Funcția publică HashTheName ( ByVal nm As String) As String. Returnare nm. GetHashCode. Funcția End. Clasa finală.

Codul care inițiază o clasă derivată din aceasta (CodedProfessionalContact în exemplu) poate apela această metodă, deoarece este moștenită.

În exemplu, am folosit VB.NET GetHashCode metoda de a menține codul simplu și aceasta a dat un rezultat destul de inutil, valoarea -520086483. Să presupunem că mi-am dorit un rezultat diferit, în schimb,

-> Nu pot schimba clasa de bază. (Poate tot ce am eu este un cod compilat de la un furnizor.)

... și ...

-> Nu pot schimba codul de apelare (poate sunt o mie de copii și nu le pot actualiza.)

Dacă pot actualiza clasa derivată, atunci pot schimba rezultatul returnat. (De exemplu, codul ar putea face parte dintr-un DLL actualizabil.)

Există o problemă. Deoarece este atât de cuprinzător și puternic, trebuie să ai permisiunea clasei de bază pentru a utiliza Anulări. Dar bibliotecile de cod bine concepute îl asigură. (Ta bibliotecile de coduri sunt toate bine concepute, nu?) De exemplu, funcția oferită de Microsoft pe care tocmai am folosit-o este suprasemnabilă. Iată un exemplu de sintaxă.

Funcție publică suprasolicitată GetHashCode ca număr întreg

Deci, acest cuvânt cheie trebuie să fie prezent și în clasa noastră de bază de exemplu.

Funcție publică suprascriere HashTheName ( ByVal nm As String) As String.

Suprasolicitarea metodei acum este la fel de simplu ca furnizarea unuia nou cu cuvântul cheie Overrides. Visual Studio vă oferă din nou un început de rulare completând codul pentru dvs. cu AutoComplete. Când intri ...


Funcții de înlocuire publică HashTheName (

Visual Studio adaugă restul codului automat imediat ce introduceți paranteza de deschidere, inclusiv instrucțiunea return care apelează doar funcția inițială din clasa de bază. (Dacă adăugați doar ceva, acesta este de obicei un lucru bun de făcut după ce noul dvs. cod se execută oricum.)

Funcții de înlocuire publică HashTheName ( nm As String) As String. Returnează MyBase. HashTheName (nm) Funcția End.

În acest caz, însă, voi înlocui metoda cu altceva la fel de inutil doar pentru a ilustra cum se face: Funcția VB.NET care va inversa șirul.

Funcții de înlocuire publică HashTheName ( nm As String) As String. Întoarce Microsoft. Visual Basic. StrReverse (nm) Funcția End.

Acum, codul apelant obține un rezultat complet diferit. (Comparați cu rezultatul din articolul despre Shadows.)


ContactID: 246. Nume comercial: Villain Defeaters, GmbH. Hash of the BusinessName: HbmG, sretaefeD nialliV. 

Puteți înlocui proprietățile. Să presupunem că ați decis că valorile ContactID mai mari de 123 nu vor fi permise și ar trebui implicit la 111. Puteți doar să înlocuiți proprietatea și să o modificați atunci când este salvată proprietatea:

Privat _ContactID ca întreg. Public Anulează proprietatea ContactID ca număr întreg. Obține. Returnare _ContactID. Încheiați. Set (valoarea ByVal ca număr întreg) Dacă valoarea> 123 Atunci. _ContactID = 111. Altfel. _ContactID = valoare. End If. Set final. Proprietate finală.

Apoi veți obține acest rezultat când o valoare mai mare este trecută:


ContactID: 111. Nume comercial: Damsel Rescuers, LTD. 

Apropo, în codul de exemple de până acum, valorile întregi sunt dublate în Nou subrutină (Vezi articolul despre Shadows), deci un număr întreg de 123 este schimbat în 246 și apoi schimbat din nou în 111.

VB.NET vă oferă, chiar mai mult, controlul, permițând unei clase de bază să solicite în mod specific sau să refuze o clasă derivată să înlocuiască folosind cuvintele cheie MustOverride și NotOverridable din clasa de bază. Dar ambele sunt utilizate în cazuri destul de specifice. În primul rând, NotOverridable.

Deoarece implicit pentru o clasă publică este NotOverridable, de ce ar trebui să o specificați vreodată? Dacă o încercați cu funcția HashTheName din clasa de bază, primiți o eroare de sintaxă, dar textul mesajului de eroare vă oferă un indiciu:

„NotOverridable” nu poate fi specificat pentru metodele care nu înlocuiesc o altă metodă.

Valoarea implicită pentru o metodă suprasolicitată este exact opusă: Anulare. Așadar, dacă doriți ca suprasolicitarea să se oprească cu siguranță acolo, trebuie să specificați NotOverridable pe acea metodă. În exemplul nostru de cod:


Public NotOverridable Înlocuiri Funcție HashTheName (... 

Atunci, dacă clasa CodedProfessionalContact este, la rândul său, moștenită ...


Clasa publică NotOverridableEx. Moștenire CodedProfesionalContact. 

... funcția HashTheName nu poate fi suprasolicitată în acea clasă. Un element care nu poate fi ignorat este uneori numit element sigilat.

O parte fundamentală a .Fundația NET este de a cere ca scopul fiecărei clase să fie definit în mod explicit pentru a înlătura toate incertitudinile. O problemă în limbile anterioare OOP a fost numită „clasa de bază fragilă”. Acest lucru se întâmplă atunci când o bază clasa adaugă o nouă metodă cu același nume cu un nume de metodă dintr-o subclasă care moștenește de la o bază clasă. Programatorul care scrie subclasa nu plănuia să depășească clasa de bază, dar acest lucru se întâmplă oricum. Se știe că acest lucru a rezultat din strigătul programatorului rănit: „Nu am schimbat nimic, dar programul meu s-a prăbușit oricum. "Dacă există posibilitatea ca o clasă să fie actualizată în viitor și să creeze această problemă, declarați-o ca fiind NotOverridable.

MustOverride este cel mai des utilizat în ceea ce se numește o clasă abstractă. (În C #, același lucru folosește cuvântul cheie Abstract!) Aceasta este o clasă care oferă doar un șablon și este de așteptat să-l completați cu propriul cod. Microsoft oferă acest exemplu al unuia:

Spălătorie publică MustInherit Class Class. Sub nou () „Codul pentru instantaneizarea clasei merge aici. Sub final. Public MustOverride Sub Wash. Public MustOverride Sub Clatire (loadSize as Integer) Funcție publică MustOverride Spin (viteză la număr întreg) la fel de lung. Clasa finală.

Pentru a continua exemplul Microsoft, mașinile de spălat vor face aceste lucruri (spălare, clătire și rotire) în mod diferit, astfel încât nu există niciun avantaj de a defini funcția din clasa de bază. Există însă un avantaj în a vă asigura că orice clasă care o moștenește pe aceasta face definiți-le. Soluția: o clasă abstractă.

Dacă aveți nevoie de și mai multe explicații despre diferențele dintre supraîncărcări și suprasolicitări, un exemplu complet diferit este dezvoltat într-un sfat rapid: suprasarcini versus suprasolicitări

VB.NET vă oferă și mai mult control, permițând unei clase de bază să solicite în mod specific sau să refuze o clasă derivată să înlocuiască folosind cuvintele cheie MustOverride și NotOverridable din clasa de bază. Dar ambele sunt utilizate în cazuri destul de specifice. În primul rând, NotOverridable.

Deoarece implicit pentru o clasă publică este NotOverridable, de ce ar trebui să o specificați vreodată? Dacă o încercați cu funcția HashTheName din clasa de bază, primiți o eroare de sintaxă, dar textul mesajului de eroare vă oferă un indiciu:

„NotOverridable” nu poate fi specificat pentru metodele care nu înlocuiesc o altă metodă.

Valoarea implicită pentru o metodă suprasolicitată este exact opusă: Anulare. Așadar, dacă doriți ca suprasolicitarea să se oprească cu siguranță acolo, trebuie să specificați NotOverridable pe acea metodă. În exemplul nostru de cod:


Public NotOverridable Înlocuiri Funcție HashTheName (... 

Atunci, dacă clasa CodedProfessionalContact este, la rândul său, moștenită ...


Clasa publică NotOverridableEx. Moștenire CodedProfesionalContact. 

... funcția HashTheName nu poate fi suprasolicitată în acea clasă. Un element care nu poate fi ignorat este uneori numit element sigilat.

O parte fundamentală a .NET Foundation este de a cere ca scopul fiecărei clase să fie definit în mod explicit pentru a înlătura toate incertitudinile. O problemă în limbile anterioare OOP a fost numită „clasa de bază fragilă”. Acest lucru se întâmplă atunci când o bază clasa adaugă o nouă metodă cu același nume cu un nume de metodă dintr-o subclasă care moștenește de la o bază clasă. Programatorul care scrie subclasa nu plănuia să depășească clasa de bază, dar acest lucru se întâmplă oricum. Se știe că acest lucru a rezultat din strigătul programatorului rănit: „Nu am schimbat nimic, dar programul meu s-a prăbușit oricum. "Dacă există posibilitatea ca o clasă să fie actualizată în viitor și să creeze această problemă, declarați-o ca fiind NotOverridable.

MustOverride este cel mai des utilizat în ceea ce se numește o clasă abstractă. (În C #, același lucru folosește cuvântul cheie Abstract!) Aceasta este o clasă care oferă doar un șablon și este de așteptat să-l completați cu propriul cod. Microsoft oferă acest exemplu al unuia:

Spălătorie publică MustInherit Class Class. Sub nou () „Codul pentru instantaneizarea clasei merge aici. Sub final. Public MustOverride Sub Wash. Public MustOverride Sub Clatire (loadSize as Integer) Funcție publică MustOverride Spin (viteză la număr întreg) la fel de lung. Clasa finală.

Pentru a continua exemplul Microsoft, mașinile de spălat vor face aceste lucruri (spălare, clătire și rotire) în mod diferit, astfel încât nu există niciun avantaj de a defini funcția din clasa de bază. Există însă un avantaj în a vă asigura că orice clasă care o moștenește pe aceasta face definiți-le. Soluția: o clasă abstractă.

Dacă aveți nevoie de și mai multe explicații despre diferențele dintre supraîncărcări și suprasolicitări, un exemplu complet diferit este dezvoltat într-un sfat rapid: suprasarcini versus suprasolicitări

instagram story viewer