Alistab VB.NET-is

click fraud protection

See on üks miniseeriaid, mis hõlmab erinevusi ülekoormustes, varjudes ja ülekirjutamises VB.NET. See artikkel hõlmab ülekirjutusi. Ülejäänud artikleid leiate siit:

-> ülekoormused
-> Varjud

Need tehnikad võib olla väga segane; nende märksõnade ja nende aluseks olevate pärimisvõimaluste kombinatsioone on palju. Microsofti enda dokumentatsioon ei hakka teema õigsust taga ajama ning veebis on palju halba või aegunud teavet. Parim nõuanne, et veenduda oma programmi õiges kodeerimises, on "Test, test and test again". Selles sarjas vaatleme neid ükshaaval, rõhutades erinevusi.

Alistab

Varjudel, ülekoormustel ja ülekirjutamistel on kõigil ühine see, et nad kasutavad elementide nime uuesti, muutes toimuvat. Varjud ja ülekoormus võivad töötada sama klassi piires või juhul, kui a klass pärib teine ​​klass. Üleskirjutusi saab siiski kasutada ainult tuletatud klassis (mida mõnikord nimetatakse lasteklassiks), mis pärib a-st põhiklass (mõnikord nimetatakse seda vanemklassiks). Ja Overrides on haamer; see võimaldab teil meetodi (või atribuudi) täielikult põhiklassist asendada.

instagram viewer

Klasside ja varjude märksõna käsitlevas artiklis (vt: VB.NET: varjud) on lisatud funktsioon, mis näitab, et päritud protseduurile saab viidata.

Avalik klass ProfessionalContact. '... koodi ei kuvata... Avalik funktsioon HashTheName ( ByVal nm kui string) kui string. Tagasi nm. GetHashCode. Lõppfunktsioon. Lõpuklass.

Kood, mis selle klassi tuletatud klassi kiirendab (näites CodedProfessionalContact), võib seda meetodit nimetada, kuna see on päritud.

Näites kasutasin VB.NET-i GetHashCode meetod lihtsa koodi hoidmiseks ja see andis üsna kasutu tulemuse väärtuse -520086483. Oletame, et ma tahtsin selle asemel teistsugust tulemust, aga

-> Ma ei saa põhiklassi muuta. (Võib-olla kõik, mis mul on, on kompileerija kood kompileeritud.)

... ja ...

-> Ma ei saa helistaja koodi muuta (võib-olla on neid tuhat eksemplari ja ma ei saa neid värskendada.)

Kui ma saan tuletatud klassi värskendada, siis saan tagastatud tulemust muuta. (Näiteks võib kood olla osa värskendatavast DLL-ist.)

On üks probleem. Kuna see on nii kõikehõlmav ja võimas, peab teil alistuste kasutamiseks olema põhiklassi luba. Kuid hästi kavandatud kooditeegid pakuvad seda. (Teie kooditeegid on kõik hästi kavandatud, eks?) Näiteks on Microsofti pakutav funktsioon, mida me just kasutasime, ületamatu. Siin on süntaksi näide.

Avalik ülepakutud funktsioon GetHashCode täisarvuna

Nii et see märksõna peab esinema ka meie näite põhiklassis.

Avalik ülekandmisele kuuluv funktsioon HashTheName ( ByVal nm kui string) kui string.

Meetodi alistamine on nüüd sama lihtne kui uue märksõna pakkumine märksõnaga Üles Visual Studio annab teile jälle käimasoleva alguse, täites teile automaatse täitmise abil teie koodi. Kui sisestad ...


Funktsiooni HashTheName avalik alistamine. 

Visual Studio lisab ülejäänud koodi automaatselt kohe, kui tipite avaussulgu, sealhulgas tagastamisavalduse, mis kutsub algfunktsiooni ainult põhiklassist. (Kui lisate lihtsalt midagi, on seda tavaliselt hea teha pärast uue koodi käivitamist.)

Funktsiooni HashTheName avalik alistamine nm kui string) kui keel. Tagastage MyBase. HashTheName (nm) Lõppfunktsioon.

Kuid sellisel juhul asendan meetodi millegi muuga, mis on sama mõttetu, lihtsalt illustreerimaks, kuidas see on tehtud: VB.NET-funktsioon, mis muudab stringi ümber.

Funktsiooni HashTheName avalik alistamine nm kui string) kui keel. Tagastage Microsoft. VisualBasic. StrReverse (nm) Lõppfunktsioon.

Nüüd saab helistamiskood hoopis teise tulemuse. (Võrdle varjude kohta käiva artikli tulemusega.)


KontaktID: 246. Ärinimi: Villain Defeaters, GmbH. Ärinime hash: HbmG, sretaefeD nialliV. 

Võite ka atribuute alistada. Oletame, et otsustasite, et kontaktiID väärtusi, mis on suuremad kui 123, ei lubata ja see peaks vaikimisi olema 111. Atribuudi salvestamisel võite selle lihtsalt alistada ja seda muuta:

Privaatne _ContactID täisarvuna. Avalik tühistab vara ContactID kui täisarvu. Saage. Tagasi _ContactID. Lõpp saada. Määra (ByVal väärtus täisarvuna) Kui väärtus> 123, siis. _ContactID = 111. Muu. _ContactID = väärtus. Lõpeta If. End Set. Lõppomand.

Suurema väärtuse ületamisel saate selle tulemuse:


KontaktID: 111. Ärinimi: Damsel Rescuers, LTD. 

Muide, seni on näitekoodis täisarv väärtused kahekordistatud alamprogramm (Vaadake artiklit Varjud), nii et täisarv 123 muudetakse 246-ks ja seejärel jälle 111-ks.

VB.NET annab teile veelgi suurema kontrolli, lubades põhiklassil nõuda või keelata tuletatud klassi ületamine, kasutades põhiklassis märksõnu MustOverride ja NotOverridable. Kuid neid mõlemaid kasutatakse üsna spetsiifilistel juhtudel. Esiteks: NotOverrivable.

Kuna avaliku klassi vaikeväärtus on NotOverrivable, miks peaksite seda kunagi määrama? Kui proovite seda põhiklassi funktsiooni HashTheName abil, saate süntaksiviga, kuid veateate tekst annab teile aimugi:

'NotOverridable' ei saa määrata meetodite jaoks, mis ei alista teist meetodit.

Ülepakutud meetodi vaikeseade on vastupidine: ülepakutud. Nii et kui soovite, et ülimuslikkus sellega kindlasti peatuks, peate selle meetodi jaoks määrama NotOverridable. Meie näidiskoodis:


Avalik NotOverrivable Alistab Funktsioon HashTheName (... 

Siis, kui klass CodedProfessionalContact on omakorda päritud ...


Avalik klass NotOverridableEx. Pärib CodedProfessionalContact. 

... funktsiooni HashTheName ei saa selles klassis üle kirjutada. Elementi, mida ei saa mööda vaadata, nimetatakse mõnikord suletud elemendiks.

Programmi põhiosa .NET sihtasutus on nõuda, et iga klassi eesmärk oleks selgesõnaliselt määratletud, et eemaldada kogu ebakindlus. Varasemate OOP-keelte probleemi on nimetatud nõrgaks põhiklassiks. See juhtub siis, kui alus klass lisab uue meetodi, sama nimega meetodi nimega, alaklassist, mis pärandub baasilt klass. Alamklassi kirjutav programmeerija ei kavatsenud põhiklassi alistada, kuid see juhtub niikuinii. Teadaolevalt on selle tagajärjel haavatud programmeerija hüüd: "Ma ei muutnud midagi, aga mu programm kukkus läbi igatahes. "Kui on võimalus, et tulevikus värskendatakse klassi ja see probleem luuakse, kuulutage see klassiks Pole ületatav.

MustOverride'i kasutatakse kõige sagedamini nn abstraktse klassina. (C #-s kasutab sama asi märksõna abstraktselt!) See on klass, mis lihtsalt pakub malli ja peaksite selle täitma oma koodiga. Microsoft pakub järgmist näidet:

Avalik MustInherit klassi pesumasin. Alam-uus () 'Klass klassi kiirendamiseks läheb siia. Lõpp alam. Avalik MustOverride Sub Wash. Avalik MustOverride alapesu loputamine (loadSize kui täisarv) Funktsiooni Spin tsentrifuugimine (kiirus täisarvuna) on pikk. Lõpuklass.

Microsofti näite jätkamiseks teevad pesumasinad neid asju (Wash, Loputa ja Spin) üsna erinevalt, seega pole põhiklassi funktsiooni määratlemisel mingit eelist. Kuid eeliseks on tagada, et klass, kes selle klassi pärib teeb määratlege need. Lahendus: abstraktne klass.

Kui vajate veelgi rohkem selgitusi ülekoormuste ja ülekirjutuste erinevuste kohta, on kiire näpunäite jaoks välja toodud täiesti erinev näide: ülekoormus versus ülepakkumine

VB.NET annab teile veelgi suurema kontrolli, lubades põhiklassil nõuda või keelata tuletatud klassi ülalt alistamine, kasutades põhiklassi märksõnu MustOverride ja NotOverridable. Kuid neid mõlemaid kasutatakse üsna spetsiifilistel juhtudel. Esiteks: NotOverrivable.

Kuna avaliku klassi vaikeväärtus on NotOverrivable, miks peaksite seda kunagi määrama? Kui proovite seda põhiklassi funktsiooni HashTheName abil, saate süntaksiviga, kuid veateate tekst annab teile aimugi:

'NotOverridable' ei saa määrata meetodite jaoks, mis ei alista teist meetodit.

Ülepakutud meetodi vaikeseade on vastupidine: ülepakutud. Nii et kui soovite, et ülimuslikkus sellega kindlasti peatuks, peate selle meetodi jaoks määrama NotOverridable. Meie näidiskoodis:


Avalik NotOverrivable Alistab Funktsioon HashTheName (... 

Siis, kui klass CodedProfessionalContact on omakorda päritud ...


Avalik klass NotOverridableEx. Pärib CodedProfessionalContact. 

... funktsiooni HashTheName ei saa selles klassis üle kirjutada. Elementi, mida ei saa mööda vaadata, nimetatakse mõnikord suletud elemendiks.

.NET Foundationi põhiosa on nõuda, et iga klassi eesmärk oleks selgesõnaliselt määratletud, et eemaldada igasugune ebakindlus. Varasemate OOP-keelte probleemi on nimetatud nõrgaks põhiklassiks. See juhtub siis, kui alus klass lisab uue meetodi, sama nimega meetodi nimega, alaklassist, mis pärandub baasilt klass. Alamklassi kirjutav programmeerija ei kavatsenud põhiklassi alistada, kuid see juhtub niikuinii. Teadaolevalt on selle tagajärjel haavatud programmeerija hüüd: "Ma ei muutnud midagi, aga mu programm kukkus läbi igatahes. "Kui on võimalus, et tulevikus värskendatakse klassi ja see probleem luuakse, kuulutage see klassiks Pole ületatav.

MustOverride'i kasutatakse kõige sagedamini nn abstraktse klassina. (C #-s kasutab sama asi märksõna abstraktselt!) See on klass, mis lihtsalt pakub malli ja peaksite selle täitma oma koodiga. Microsoft pakub järgmist näidet:

Avalik MustInherit klassi pesumasin. Alam-uus () 'Klass klassi kiirendamiseks läheb siia. Lõpp alam. Avalik MustOverride Sub Wash. Avalik MustOverride alapesu loputamine (loadSize kui täisarv) Funktsiooni Spin tsentrifuugimine (kiirus täisarvuna) on pikk. Lõpuklass.

Microsofti näite jätkamiseks teevad pesumasinad neid asju (Wash, Loputa ja Spin) üsna erinevalt, seega pole põhiklassi funktsiooni määratlemisel mingit eelist. Kuid eeliseks on tagada, et klass, kes selle klassi pärib teeb määratlege need. Lahendus: abstraktne klass.

Kui vajate veelgi rohkem selgitusi ülekoormuste ja ülekirjutuste erinevuste kohta, on kiire näpunäite jaoks välja toodud täiesti erinev näide: ülekoormus versus ülepakkumine

instagram story viewer