Ez egy mini sorozat, amely fedezi a túlterhelések, az árnyékok és a felülírások különbségeit VB.NET. Ez a cikk az felülírásokról szól. A többi cikkről itt olvashat:
-> Túlterhelések
-> Árnyékok
Ezek a technikák nagyon zavaró lehet; ezeknek a kulcsszavaknak és az alapjául szolgáló öröklési lehetőségeknek sok kombinációja van. A Microsoft saját dokumentációja nem kezdi az igazságosság témáját, és sok rossz vagy elavult információ található az interneten. A legjobb tanács annak ellenőrzéséhez, hogy a program helyesen van-e kódolva: "Tesztelje, tesztelje és tesztelje újra." Ebben a sorozatban egyrészt rájuk nézünk, különbségekre összpontosítva.
felülírásai
Az árnyékok, a túlterhelések és az felülbírálatok mind közös, az, hogy újrafelhasználják az elemek nevét, miközben megváltoztatják, mi történik. Az árnyékok és a túlterhelések egyazon osztályon belül működhetnek, vagy ha a osztály örököl egy másik osztály. A felülbírálás azonban csak egy származtatott osztályban használható (néha gyermekosztálynak is hívható), amely az a-tól örököl
alap osztály (néha szülőosztálynak hívják). És az felülbírálás a kalapács; lehetővé teszi egy módszer (vagy tulajdonság) teljes helyettesítését egy alaposztályból.Az osztályokról és az Árnyak kulcsszóról szóló cikkben (Lásd: Árnyékok a VB.NET-ben) egy funkció került hozzáadásra, amely megmutatja, hogy egy örökölt eljárás hivatkozható-e.
Nyilvános osztályú ProfessionalContact. '... a kód nem látható... HashTheName nyilvános funkció ( ByVal nm mint húrok) mint húrok. Visszatérési nm. GetHashCode. Vége funkció. Végkategória.
Az a kód, amely az ebből származtatott osztályt utánozza (a példában a CodedProfessionalContact) ezt a módszert hívhatja, mert örökölt.
A példában a VB.NET-et használtam GetHashCode módszer, amellyel a kód egyszerű, és ez meglehetősen haszontalan eredményt hozott, az érték -520086483. Tegyük fel, hogy szeretnék egy másik eredményt visszatérni, hanem,
-> Nem tudom megváltoztatni az alaposztályt. (Lehet, hogy minden, amit egy eladó gyártói kódból állítottam össze.)
... és ...
-> Nem tudom megváltoztatni a hívószámot (Talán létezik ezer példány, és nem tudom frissíteni őket.)
Ha frissíteni tudom a származtatott osztályt, akkor megváltoztathatom a visszaadott eredményt. (Például a kód része lehet egy frissíthető DLL-nek.)
Van egy probléma. Mivel annyira átfogó és hatalmas, a felülírások használatához engedélyt kell kapnia az alaposztálytól. A jól megtervezett kódkönyvtárak ezt biztosítják. (A ti a kódkönyvtárak mindegyike jól megtervezett, ugye?) Például a Microsoft által nyújtott funkció, amelyet éppen használunk, meghaladhatatlan. Íme egy példa a szintaxisra.
Nyilvános, átruházható funkció, a GetHashCode egész számként
Tehát ennek a kulcsszónak jelen kell lennie a példa alap osztályban is.
Nyilvános, túlméretezhető funkció HashTheName ( ByVal nm mint húrok) mint húrok.
A módszer felülbírálása most olyan egyszerű, mint egy új biztosítása a felülbírálás kulcsszóval. A Visual Studio ismét egy futó indítást kínál azáltal, hogy kitölti az Ön kódját az AutoComplete segítségével. Amikor belépsz ...
A HashTheName nyilvános felülbírálása (
A Visual Studio automatikusan hozzáadja a kód többi részét, amint beírja a nyitó zárójelet, beleértve a visszatérési nyilatkozatot is, amely csak az alapfunkciót hívja meg az alaposztályból. (Ha csak valamit ad hozzá, ez általában jó dolog, ha az új kódot egyébként végrehajtja.)
A HashTheName nyilvános felülbírálása ( nm As String) As String. Vissza a MyBase-t. HashTheName (nm) Vége funkció.
Ebben az esetben azonban a módszert kicserélem egy másikra, ugyanolyan haszontalanra, csak annak illusztrálására, hogy hogyan történik: A VB.NET függvény, amely megfordítja a karakterláncot.
A HashTheName nyilvános felülbírálása ( nm As String) As String. Vissza a Microsoft-hoz. VisualBasic. StrReverse (nm) Vége funkció.
Most a hívó kód teljesen más eredményt kap. (Hasonlítsa össze az árnyékokról szóló cikk eredményével.)
ContactID: 246. BusinessName: Villain Defeaters, GmbH. A BusinessName szóköz: HbmG, SretaefeD nialliV.
A tulajdonságokat is felülbírálhatja. Tegyük fel, hogy úgy döntött, hogy a 123-nál nagyobb ContactID-értékek nem engedélyezettek, és alapértelmezés szerint 111-re állnak. A tulajdonság mentésekor egyszerűen felülbírálhatja és megváltoztathatja azt:
Magán _ContactID egész számként. Nyilvános felülbírálja az PropertyID azonosítót egész számként. Kap. Vissza _ContactID. End Get. Beállítva (ByVal érték egész számként) Ha az érték> 123, akkor. _ContactID = 111. Más. _ContactID = érték. Vége If. Vége. Végtulajdon.
Akkor kapja ezt az eredményt, ha nagyobb értéket ad át:
ContactID: 111. BusinessName: Damsel Rescuers, LTD.
Mellesleg, a példakódban eddig az egész értékek megduplázódtak az Új értéknél szubrutin (Lásd az árnyékokról szóló cikket), tehát a 123 egész szám 246-ra változik, majd ismét 111-re változik.
A VB.NET még nagyobb ellenőrzést biztosít azáltal, hogy lehetővé teszi egy alaposztály számára, hogy kifejezetten megkövetelje vagy megtagadja a származtatott osztály felülírását az alaposztály MustOverride és NotOverridable kulcsszavai segítségével. De mindkettőt meglehetősen specifikus esetekben használják. Először is: Nem áttekinthető.
Mivel a nyilvános osztályok alapértelmezett értéke nem felejthetetlen, miért kellene mindig meghatároznia? Ha kipróbálja az alaposztály HashTheName függvényén, akkor szintaxis hibát kap, de a hibaüzenet szövege nyomot ad:
A „NotOverrivable” nem adható meg olyan módszereknél, amelyek nem felülírják egy másik módszert.
A felülbírált módszer alapértelmezése éppen az ellenkezője: felülbírálható. Tehát ha azt akarja, hogy a felülbírálás véglegesen megálljon, meg kell adnia a NotOverridable alkalmazást ezen a módszernél. A példakódban:
Nyilvános nem áttekinthető felülírásai Funkció HashTheName (...
Akkor, ha a CodedProfessionalContact osztály öröklődik ...
Nyilvános osztály NotOverridableEx. Öröklések CodedProfessionalContact.
... a HashTheName függvényt nem lehet felülírni abban az osztályban. Egy olyan elemet, amelyet nem lehet felülbírálni, néha lezárt elemnek nevezik.
Alapvető része a az .NET Alapítvány az a követelmény, hogy minden osztály célja kifejezetten meg legyen határozva az összes bizonytalanság megszüntetésében. A korábbi OOP nyelvek egyik problémáját „törékeny alaposztálynak” hívták. Ez akkor történik, amikor egy alap Az class hozzáad egy új módszert, azzal a névvel, mint a metódus neve egy alosztályban, amely egy bázistól örököl osztály. Az alosztályt író programozó nem tervezte az alaposztály felülírását, de egyébként pontosan ez történik. Ez ismert módon a sérült programozó kiáltását eredményezte: "Nem változtattam semmit, de a programom összeomlott "" Ha fennáll annak a lehetősége, hogy a jövőben egy osztály frissítésre kerül, és ezzel létrejön a probléma, akkor tegye azt NotOverridable.
A MustOverride-et leggyakrabban az absztrakt osztálynak nevezik. (A C #-ban ugyanaz a kulcsszó használja az Absztrakt kulcsszót.) Ez egy osztály, amely csak egy sablont biztosít, és várhatóan kitölti azt a saját kódjával. A Microsoft a következő példát nyújtja:
Nyilvános MustInherit osztályú mosógép. Sub Új () - Ide kerül az osztály elindításához szükséges kód. Befejezés al. Nyilvános MustOverride Sub Wash. Nyilvános MustOverride öblítés (loadSize as Integer) A nyilvános MustOverride funkció centrifugálás (sebesség egész szám), amíg hosszú. Végkategória.
A Microsoft példájának folytatásaként a mosógépek ezeket a dolgokat (mosás, öblítés és centrifugálás) meglehetõsen eltérõ módon fogják elvégezni, tehát nincs elõnye annak, hogy az alaposztályban meghatározzuk a funkciót. Ennek előnye azonban annak biztosítása, hogy bármelyik osztály örökli ezt csinál határozza meg őket. A megoldás: elvont osztály.
Ha még több magyarázatra van szüksége a túlterhelések és a felülbírálatok közötti különbségekről, egy teljesen más példát fejlesztettünk ki egy Gyors tippben: Túlterhelés versus felülbírálás
A VB.NET még nagyobb ellenőrzést biztosít azáltal, hogy lehetővé teszi egy alaposztály számára, hogy kifejezetten megkövetelje vagy megtagadja a származtatott osztály felülírását az alaposztály MustOverride és NotOverridable kulcsszavainak használatával. De mindkettőt meglehetősen specifikus esetekben használják. Először is: Nem áttekinthető.
Mivel a nyilvános osztályok alapértelmezett értéke nem felejthetetlen, miért kellene mindig meghatároznia? Ha kipróbálja az alaposztály HashTheName függvényén, akkor szintaxis hibát kap, de a hibaüzenet szövege nyomot ad:
A „NotOverrivable” nem adható meg olyan módszereknél, amelyek nem felülírják egy másik módszert.
A felülbírált módszer alapértelmezése éppen az ellenkezője: felülbírálható. Tehát ha azt akarja, hogy a felülbírálás véglegesen megálljon, meg kell adnia a NotOverridable alkalmazást ezen a módszernél. A példakódban:
Nyilvános nem áttekinthető felülírásai Funkció HashTheName (...
Akkor, ha a CodedProfessionalContact osztály öröklődik ...
Nyilvános osztály NotOverridableEx. Öröklések CodedProfessionalContact.
... a HashTheName függvényt nem lehet felülírni abban az osztályban. Egy olyan elemet, amelyet nem lehet felülbírálni, néha lezárt elemnek nevezik.
A .NET Alapítvány alapvető része annak megkövetelése, hogy minden osztály célja kifejezetten meghatározásra kerüljön minden bizonytalanság megszüntetésére. A korábbi OOP nyelvek egyik problémáját „törékeny alaposztálynak” hívták. Ez akkor történik, amikor egy alap Az class hozzáad egy új módszert, azzal a névvel, mint a metódus neve egy alosztályban, amely egy bázistól örököl osztály. Az alosztályt író programozó nem tervezte az alaposztály felülírását, de egyébként pontosan ez történik. Ez ismert módon a sérült programozó kiáltását eredményezte: "Nem változtattam semmit, de a programom összeomlott "" Ha fennáll annak a lehetősége, hogy a jövőben egy osztály frissítésre kerül, és ezzel létrejön a probléma, akkor tegye azt NotOverridable.
A MustOverride-et leggyakrabban az absztrakt osztálynak nevezik. (A C #-ban ugyanaz a kulcsszó használja az Absztrakt kulcsszót.) Ez egy osztály, amely csak egy sablont biztosít, és várhatóan kitölti azt a saját kódjával. A Microsoft a következő példát nyújtja:
Nyilvános MustInherit osztályú mosógép. Sub Új () - Ide kerül az osztály elindításához szükséges kód. Befejezés al. Nyilvános MustOverride Sub Wash. Nyilvános MustOverride öblítés (loadSize as Integer) A nyilvános MustOverride funkció centrifugálás (sebesség egész szám), amíg hosszú. Végkategória.
A Microsoft példájának folytatásaként a mosógépek ezeket a dolgokat (mosás, öblítés és centrifugálás) meglehetõsen eltérõ módon fogják elvégezni, tehát nincs elõnye annak, hogy az alaposztályban meghatározzuk a funkciót. Ennek előnye azonban annak biztosítása, hogy bármelyik osztály örökli ezt csinál határozza meg őket. A megoldás: elvont osztály.
Ha még több magyarázatra van szüksége a túlterhelések és a felülbírálatok közötti különbségekről, egy teljesen más példát fejlesztettünk ki egy Gyors tippben: Túlterhelés versus felülbírálás