Toto je jedna z mini-sérií, ktorá pokrýva rozdiely v preťažení, tieňoch a prepísaní VB.NET. Tento článok sa zaoberá prepísaním. Články, ktoré sa týkajú ostatných, sú tu:
-> Preťaženia
-> Tiene
Tieto techniky môže byť veľmi mätúci; existuje veľa kombinácií týchto kľúčových slov a základných možností dedenia. Vlastná dokumentácia spoločnosti Microsoft nezačína vykonávať spravodlivosť na tému a na webe je veľa zlých alebo zastaraných informácií. Najlepšia rada, aby ste sa uistili, že je váš program správne kódovaný, je „Test, test a test znova“. V tejto sérii sa na ne pozrieme jeden po druhom s dôrazom na rozdiely.
prepisy
Spoločným znakom Shadows, Overloads a Overrides je to, že znova používajú názov prvkov a zároveň menia, čo sa stane. Tiene a preťaženia môžu fungovať v rámci rovnakej triedy alebo vtedy, keď a trieda dedí iná trieda. Prepíše sa však môže iba v odvodenej triede (niekedy nazývanej podradená trieda), ktorá dedí od a základná trieda (niekedy sa nazýva rodičovská trieda). A potlačenie je kladivo; umožňuje vám úplne nahradiť metódu (alebo vlastnosť) zo základnej triedy.
V článku o triedach a kľúčovom slove tieňov (pozri: Tiene vo VB.NET) bola pridaná funkcia, ktorá ukazuje, že je možné odkazovať na zdedenú procedúru.
Public Class ProfessionalKontakt. '... kód nie je zobrazený... HashTheName verejnej funkcie ( ByVal nm ako reťazec) ako reťazec. Návrat nm. GetHashCode. Ukončenie funkcie. Koncová trieda.
Kód, ktorý vytvorí inštanciu triedy odvodenej od tejto triedy (v príklade CodedProfessionalContact), môže túto metódu nazvať, pretože je zdedená.
V príklade som použil VB.NET GetHashCode spôsob, ako udržať kód jednoduchý, a to vrátilo pomerne zbytočný výsledok, hodnotu -520086483. Predpokladajme, že chcem namiesto toho vrátiť iný výsledok,
-> Nemôžem zmeniť základnú triedu. (Možno mám len zostavený kód od dodávateľa.)
... a ...
-> Nemôžem zmeniť volací kód (možno existuje tisíc kópií a nemôžem ich aktualizovať.)
Ak dokážem aktualizovať odvodenú triedu, môžem zmeniť vrátený výsledok. (Napríklad kód by mohol byť súčasťou aktualizovateľnej knižnice DLL.)
Je tu jeden problém. Pretože je tak komplexný a výkonný, musíte mať povolenie od základnej triedy na používanie nahradení. Poskytujú to však dobre navrhnuté knižnice kódov. (tvoj knižnice kódu sú všetky dobre navrhnuté, nie?) Napríklad funkcia, ktorú sme práve použili, je preplnená. Tu je príklad syntaxe.
Verejná funkcia OverHable GetHashCode ako celé číslo
Toto kľúčové slovo musí byť preto prítomné aj v našej základnej triede.
Verejná funkcia overashable HashTheName ( ByVal nm ako reťazec) ako reťazec.
Potlačenie metódy je teraz rovnako jednoduché ako poskytnutie nového kľúčového slova Prepísať. Aplikácia Visual Studio vám znova spustí spustenie vyplnením kódu pomocou funkcie AutoComplete. Keď zadáte ...
Funkcia verejného potlačenia funkcie HashTheName (
Visual Studio pridá zvyšok kódu automaticky, akonáhle napíšete úvodnú zátvorku, vrátane príkazu return, ktorý volá iba pôvodnú funkciu zo základnej triedy. (Ak niečo len pridávate, je to zvyčajne dobré, keď sa váš nový kód napriek tomu spustí.)
Funkcia verejného potlačenia funkcie HashTheName ( nm ako reťazec) ako reťazec. Vráťte MyBase. HashTheName (nm) Ukončenie funkcie.
V tomto prípade však túto metódu nahradím niečím rovnako rovnako zbytočným, len aby som ilustroval, ako sa to robí: Funkcia VB.NET, ktorá zmení reťazec.
Funkcia verejného potlačenia funkcie HashTheName ( nm ako reťazec) ako reťazec. Vrátiť spoločnosť Microsoft. VisualBasic. StrReverse (nm) Ukončenie funkcie.
Volací kód má teraz úplne iný výsledok. (Porovnajte s výsledkom v článku o tieňoch.)
ContactID: 246. Obchodné meno: Villain Defeaters, GmbH. Hash of BusinessName: HbmG, sretaefeD nialliV.
Môžete prepísať aj vlastnosti. Predpokladajme, že ste sa rozhodli, že hodnoty ContactID väčšie ako 123 nebudú povolené a mali by ste predvolene 111. Môžete iba prepísať vlastníctvo a zmeniť ho, keď je vlastníctvo uložené:
Súkromné _KontaktID ako celé číslo. Verejné prepíše ID kontaktu ako celé číslo. Získať. Návrat _KontaktID. End Get. Set (hodnota ByVal ako celé číslo) Ak je hodnota> 123 Potom. _KontaktID = 111. Inde. _ContactID = hodnota. Koniec Ak. End Set. Ukončiť vlastníctvo.
Tento výsledok dostanete, keď je odovzdaná väčšia hodnota:
ContactID: 111. Obchodné meno: Damsel Rescuers, LTD.
Mimochodom, v doterajšom príklade kódu sú celočíselné hodnoty v Novom zdvojnásobené podprogram (Pozri článok o tieňoch), takže celé číslo 123 sa zmení na 246 a potom sa znova zmení na 111.
VB.NET vám poskytuje ešte väčšiu kontrolu tým, že umožňuje základnej triede špecificky vyžadovať alebo zakázať odvodenú triedu, aby prepísala pomocou kľúčových slov MustOverride a NotOverridable v základnej triede. Obidva sa však používajú v pomerne špecifických prípadoch. Po prvé, nie je možné ho zmeniť.
Pretože predvolená hodnota pre verejnú triedu je NotOverridable, prečo by ste ju mali niekedy potrebovať? Ak to vyskúšate vo funkcii HashTheName v základnej triede, zobrazí sa chyba syntaxe, ale text chybovej správy vám poskytne vodítko:
„NotOverridable“ nie je možné určiť pre metódy, ktoré neprepíšu inú metódu.
Predvolená hodnota pre metódu overridden je práve naopak: Overrideable. Takže ak chcete potlačiť, aby sa to definitívne zastavilo, musíte pre túto metódu určiť NotOverridable. V našom príklade kódu:
Verejné neoveriteľné prepisy Funkcia HashTheName (...
Potom, ak je trieda CodedProfessionalContact zdedená ...
Verejná trieda NotOverridableEx. Zdedí kódovanýProfesionálny kontakt.
... funkcia HashTheName sa nedá prepísať v tejto triede. Prvok, ktorý nemožno prepísať, sa niekedy nazýva zapečatený prvok.
Základná súčasť .NET Foundation znamená, že účel každej triedy je výslovne definovaný tak, aby sa odstránila všetka neistota. Problém v predchádzajúcich jazykoch OOP sa nazýval „krehká základná trieda“. To sa stane, keď základňa trieda pridá novú metódu s rovnakým názvom ako názov metódy v podtriede, ktorá zdedí od základne trieda. Programátor, ktorý píše podtriedu, nemal v pláne prepísať základnú triedu, ale aj tak sa to presne deje. Je známe, že to má za následok výkrik zraneného programátora, „nič som nezmenil, ale môj program havaroval "Ak existuje možnosť, že trieda bude v budúcnosti aktualizovaná a vytvorí tento problém, vyhláste ju ako NotOverridable.
MustOverride sa najčastejšie používa v tzv. Abstraktnej triede. (V C #, tá istá vec používa kľúčové slovo Abstrakt!) Toto je trieda, ktorá poskytuje iba šablónu a očakáva sa, že ju vyplníte svojím vlastným kódom. Spoločnosť Microsoft poskytuje tento príklad:
Verejné umývacie stroje triedy MustInherit. Nové () „Sem ide kód na vytvorenie inštancie triedy. Koniec sub. Verejné vedľajšie pranie MustOverride. Verejné podplachovanie MustOverride (loadSize as Integer) Verejná rotácia funkcie MustOverride (rýchlosť ako celé číslo) tak dlhá. Koncová trieda.
Aby sme pokračovali v príklade Microsoftu, práčky budú robiť tieto veci (pranie, pláchanie a odstreďovanie) celkom odlišne, takže neexistuje žiadna výhoda definovania funkcie v základnej triede. Výhodou však je, že každá trieda zdedí túto triedu robí definovať ich. Riešenie: abstraktná trieda.
Ak potrebujete ďalšie vysvetlenie rozdielov medzi preťaženiami a prepismi, v Rýchlom tipe je uvedený úplne iný príklad: Preťaženia verzus nahradenia.
VB.NET vám poskytuje ešte väčšiu kontrolu tým, že umožňuje základnej triede špecificky požadovať alebo zamietnuť odvodenú triedu na prepísanie pomocou kľúčových slov MustOverride a NotOverridable v základnej triede. Obidva sa však používajú v pomerne špecifických prípadoch. Po prvé, nie je možné ho zmeniť.
Pretože predvolená hodnota pre verejnú triedu je NotOverridable, prečo by ste ju mali niekedy potrebovať? Ak to vyskúšate vo funkcii HashTheName v základnej triede, zobrazí sa chyba syntaxe, ale text chybovej správy vám poskytne vodítko:
„NotOverridable“ nie je možné určiť pre metódy, ktoré neprepíšu inú metódu.
Predvolená hodnota pre metódu overridden je práve naopak: Overrideable. Takže ak chcete potlačiť, aby sa to definitívne zastavilo, musíte pre túto metódu určiť NotOverridable. V našom príklade kódu:
Verejné neoveriteľné prepisy Funkcia HashTheName (...
Potom, ak je trieda CodedProfessionalContact zdedená ...
Verejná trieda NotOverridableEx. Zdedí kódovanýProfesionálny kontakt.
... funkcia HashTheName sa nedá prepísať v tejto triede. Prvok, ktorý nemožno prepísať, sa niekedy nazýva zapečatený prvok.
Základnou súčasťou .NET Foundation je požadovať, aby bol účel každej triedy výslovne určený na odstránenie všetkej neistoty. Problém v predchádzajúcich jazykoch OOP sa nazýval „krehká základná trieda“. To sa stane, keď základňa trieda pridá novú metódu s rovnakým názvom ako názov metódy v podtriede, ktorá zdedí od základne trieda. Programátor, ktorý píše podtriedu, nemal v pláne prepísať základnú triedu, ale aj tak sa to presne deje. Je známe, že to má za následok výkrik zraneného programátora, „nič som nezmenil, ale môj program havaroval "Ak existuje možnosť, že trieda bude v budúcnosti aktualizovaná a vytvorí tento problém, vyhláste ju ako NotOverridable.
MustOverride sa najčastejšie používa v tzv. Abstraktnej triede. (V C #, tá istá vec používa kľúčové slovo Abstrakt!) Toto je trieda, ktorá poskytuje iba šablónu a očakáva sa, že ju vyplníte svojím vlastným kódom. Spoločnosť Microsoft poskytuje tento príklad:
Verejné umývacie stroje triedy MustInherit. Nové () „Sem ide kód na vytvorenie inštancie triedy. Koniec sub. Verejné vedľajšie pranie MustOverride. Verejné podplachovanie MustOverride (loadSize as Integer) Verejná rotácia funkcie MustOverride (rýchlosť ako celé číslo) tak dlhá. Koncová trieda.
Aby sme pokračovali v príklade Microsoftu, práčky budú robiť tieto veci (pranie, pláchanie a odstreďovanie) celkom odlišne, takže neexistuje žiadna výhoda definovania funkcie v základnej triede. Výhodou však je, že každá trieda zdedí túto triedu robí definovať ich. Riešenie: abstraktná trieda.
Ak potrebujete ďalšie vysvetlenie rozdielov medzi preťaženiami a prepismi, v Rýchlom tipe je uvedený úplne iný príklad: Preťaženia verzus nahradenia.