Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 18805|Odpoveď: 0

[Komunikácia] Podobnosti a rozdiely medzi virtuálnym a (abstraktným) abstraktom a rozhraním v C#...

[Kopírovať odkaz]
Zverejnené 22. 4. 2019 14:41:09 | | |
Interpretácia 1

V C# sú Abstract a Virtual mätúce, obe súvisia s dedičnosťou a vyžadujú použitie prepísania. Poďme si porozprávať o rozdieloch medzi týmito dvoma:

1. Virtuálna metóda

virtuálne kľúčové slovo sa používa na úpravu metód v základnej triede. Existujú dve situácie, keď sa používa virtuálne:

Scenár 1: Virtuálna metóda je definovaná v základnej triede, ale virtuálna metóda nie je prepísaná v odvodenej triede. Pri volaní na inštanciu odvodených tried virtuálna metóda používa metódu definovanú základnou triedou.

Scenár 2: V základnej triede je definovaná virtuálna metóda a následne sa metóda prepíše pomocou prepísania v odvodenej triede. Pri volaní inštancie odvodených tried virtuálna metóda používa odvodenú metódu prepísania.

2. Abstraktná metóda (abstraktná metóda)

Abstraktné kľúčové slovo môže byť použité iba v abstraktných triedach na úpravu metód a neexistuje žiadna špecifická implementácia. Implementácia abstraktných metód musí byť implementovaná pomocou prepísaného kľúčového slova v odvodenej triede.

Najpodstatnejší rozdiel medzi rozhraním a abstraktnou triedou: abstraktná trieda je neúplná trieda, abstrakcia objektu, zatiaľ čo rozhranie je behaviorálna norma.


3. Kľúčové slová

Statické: Keď je metóda deklarovaná ako statická, metóda je statická a kompilátor ponechá implementáciu metódy v čase kompilácie. To znamená, že metóda patrí triede, ale nie žiadnemu členovi, bez ohľadu na to, či inštancia tejto triedy existuje alebo nie. Rovnako ako vstupná funkcia Static void Main, keďže ide o statickú funkciu, môže byť volaná priamo.

Virtua: Keď je metóda deklarovaná ako virtuálna, je to virtuálna metóda, kým nepoužijete premennú ClassName = nový ClassName(); Pred deklarovaním inštancie triedy neexistuje v reálnom pamäťovom priestore. Toto kľúčové slovo sa veľmi často používa pri dedičnosti tried na poskytovanie podpory polymorfizmu pre triedne metódy.

overrride: označuje prepísanie Táto trieda sa dedí z triedy Shape
virtuálne, abstraktné znamená povedať ostatným triedam, ktoré chcú od neho dediť, že môžete túto moju metódu alebo vlastnosť prepísať, inak to nie je povolené.
Abstrakt: Deklarácia abstraktnej metódy je metóda, ktorú musí prepísať odvodená trieda, ktorá sa používa na dedičstvo; Dá sa považovať za imaginárnu metódu bez realizácie; Ak trieda obsahuje abstraktnú metódu, musí byť definovaná ako abstraktná trieda, bez ohľadu na to, či obsahuje iné všeobecné metódy alebo nie; Abstraktné triedy nemôžu obsahovať substancie.

a) Metóda virtuálnej modifikácie musí mať implementáciu metódy (aj keď ide len o pár zátvoriek) a metóda abstraktnej modifikácie nemôže mať implementáciu.

b) virtuálne môžu byť prepísané podtriedami, abstraktné musí byť prepísané podtriedami

c) Ak je funkcia v triede modifikovaná abstaktom, názov triedy musí byť tiež upravený s abstactom

d) Abstraktné modifikované triedy nemôžu byť vytvorené inštancie.

e) Ak je metóda v C# pripravená prepísať rodičovskú triedu v podtriede, metóda musí byť upravená tak, že virtuálna v nadradenej triede a prejdú do podtriedy, aby programátor neúmyselne prepísal rodičovskú metódu nadradenej triedy v podtriede.

Poznámka: Triedy upravené abstraktom môžu byť iba dedičné, nie inštanciované.

Interpretácia 2

Virtuálne aj abstraktné sa používajú na úpravu rodičovskej triedy, čo umožňuje redefinovať podriadenú triedu prepísaním definície rodičovskej triedy.

Majú jednu spoločnú vlastnosť: ak sa používajú na úpravu metód, musí sa pred ne pridať verejné, inak sa objavia kompilačné chyby: virtuálne metódy alebo abstraktné metódy nemôžu byť súkromné. Napokon, pridaním virtuálneho alebo abstraktného režimu je možné podtriedu predefinovať a privátne členovia nie sú pre podtriedu prístupní.

Ale sú veľmi odlišné. (virtuálne znamená "virtuálne", abstraktné je "abstraktné").

(1) Metóda virtuálnej modifikácie musí byť implementovaná (aj keď pridáva len pár zátvoriek), zatiaľ čo metóda abstraktnej modifikácie nesmie byť implementovaná. Napríklad, ak metóda virtuálnej modifikácie nie je implementovaná:

Chyba: "Test1.fun1()" musí deklarovať telo, pretože nie je označené ako abstraktné, externé alebo čiastočné   

Pre abstraktné modifikátory, ak sú implementované:


Chyba: "Test2.fun2()" nemôže deklarovať telo, pretože je označené ako abstraktné   

(2) virtuálne môžu byť prepísané podtriedami, zatiaľ čo abstraktné musí byť prepísané podtriedami.
Pri kompilácii nie je chyba, ak je metóda virtuálneho modifikátora prepísaná, musí byť pred ňou pridaný override (ktorý kompilátoru oznámi, že chcete prepísať virtuálnu metódu) a musí existovať implementácia, inak bude kompilácia nesprávna:
(3) Ak je člen triedy modifikovaný abstraktom, abstrakt musí byť pridaný pred triedu, pretože abstraktné metódy môžu mať len abstraktné triedy.

(4) Inštancie abstraktných tried nie je možné vytvárať, môžu byť iba zdedené a nemôžu byť inštanciované, napríklad: BaseTest2 base2 = nový BaseTest2(); Dôjde k chybe pri kompilácii: abstraktná trieda alebo rozhranie nemôže vytvoriť inštanciu.

(5) V C#, ak chcete prepísať metódu v podtriede, musíte pridať virtual pred rodičovskú metódu a prepísať pred podtriednou metódou, aby ste predišli tomu, že programátori omylom prepíšu rodičovskú metódu v podtriede.

(6) Abstraktná metóda musí byť prepísaná a virtuálna metóda musí mať implementáciu (aj keď je definovaná v abstraktnej triede).
Interpretácia 3
Podobnosti:
1. Všetky sa dajú zdediť
2. Žiadna z nich nemôže byť inštanciovaná
3. Môže obsahovať deklarácie metód
4. Odvodené triedy musia implementovať nerealizované metódy
Rozlišovať:
1. Abstraktné základné triedy môžu definovať polia, atribúty a implementácie metód. Rozhrania môžu definovať iba atribúty, indexátory, udalosti a deklarácie metód a nemôžu obsahovať polia.
2. Abstraktná trieda je neúplná trieda, ktorú je potrebné ďalej upresniť, zatiaľ čo rozhranie je behaviorálna norma. Vlastné rozhrania Microsoftu vždy obsahujú schopné pole, ktoré dokazuje, že sú vyjadrením "Dokážem to..." ”
3. Rozhrania môžu byť implementované viackrát a abstraktné triedy môže dediť len jedna osoba
4. Abstraktné triedy sú viac definované medzi sériou úzko súvisiacich tried, zatiaľ čo väčšina rozhraní je voľne prepojená, ale všetky implementujú určitú funkciu
5. Abstraktné triedy sú pojmy abstrahované zo série súvisiacich objektov, takže odrážajú vnútornú spoločnosť vecí; Rozhranie je funkčná konvencia definovaná na uspokojenie vonkajších volaní, takže odráža vonkajšie charakteristiky vecí
6. Rozhranie v podstate nemá žiadne špecifické charakteristiky dedičnosti, iba sľubuje metódu, ktorú možno volať
7. Rozhranie môže podporovať spätné volania, ale dedičnosť túto funkciu nemá
8. Konkrétne metódy implementované abstraktnými triedami sú predvolene virtuálne, ale rozhrania v triede, ktorá implementuje rozhranie, sú predvolene nevirtuálne, samozrejme, môžete ich tiež deklarovať ako virtuálne
9. Ak abstraktná trieda implementuje rozhranie, metóda v rozhraní môže byť mapovaná na abstraktnú triedu ako abstraktná metóda bez nutnosti jej implementácie, ale metóda v rozhraní môže byť implementovaná v podtriede abstraktnej triedy
Pravidlá používania:
1. Abstraktné triedy sa používajú hlavne pre úzko súvisiace objekty, zatiaľ čo rozhrania sú najlepšie na poskytovanie všeobecnej funkcionality pre irelevantné triedy
2. Ak chcete navrhnúť veľkú funkčnú jednotku, použite abstraktné triedy; Ak chcete navrhovať malé, stručné funkčné bloky, použite rozhrania.
3. Ak sa očakáva vytvorenie viacerých verzií komponentu, vytvorte abstraktnú triedu. Keď je rozhranie vytvorené, už ho nie je možné zmeniť. Ak je potrebná nová verzia rozhrania, musí byť vytvorené úplne nové rozhranie.
4. Ak bude vytvorená funkcia použitá medzi širokým spektrom heterogénnych objektov, použite rozhranie; Ak chcete poskytnúť spoločnú implementovanú funkcionalitu naprieč všetkými implementáciami komponentu, použite abstraktné triedy.
5. Analyzovať objekt, spresniť vnútornú spoločnosť do abstraktnej triedy, ktorá sa používa na vyjadrenie podstaty objektu, teda "čo". Rozhrania sú prioritizované, keď je potrebné rozšíriť externé volania alebo funkcie
6. Dobrá definícia rozhrania by mala byť špecifická a funkčná, nie multifunkčná, inak spôsobí znečistenie rozhrania. Ak trieda implementuje len jednu funkciu rozhrania, ale musí implementovať iné metódy v rozhraní, nazýva sa to znečistenie rozhraním
7. Snažte sa vyhnúť dedičnosti na dosiahnutie funkcie formácie, ale použite multiplexovanie čiernej skrinky, teda kombináciu objektov. Kvôli zvýšeniu počtu dedičných úrovní je najpriamejším dôsledkom to, že keď zavoláte triedu v tomto taxóne, musíte ich všetky nahrať do zásobníka! Dôsledky si možno predstaviť. (V kombinácii s pochopením princípu zásobníka). Zároveň si záujemcovia môžu všimnúť, že Microsoft často používa metódu kombinovania objektov pri tvorbe triedy. Napríklad v asp.net má trieda Page vlastnosti ako Server Request, ale v skutočnosti sú to všetky objekty určitej triedy. Použitie tohto objektu triedy Page na volanie metód a vlastností iných tried je veľmi základný princíp návrhu
Napríklad:
Okenné formy môžu byť navrhnuté s abstraktnými triedami a verejné operácie a vlastnosti môžu byť umiestnené do abstraktnej triedy, takže forma a dialógové okno môžu dediť z tejto abstraktnej triedy a potom sa rozširovať a zlepšovať podľa vlastných potrieb.

Tlačová operácia môže byť poskytnutá ako rozhranie ku každému formuláru, ktorý túto funkciu potrebuje, pretože obsah formulára je odlišný a musia si podľa vlastných požiadaviek implementovať vlastnú tlačovú funkciu. Pri tlači sa volá iba cez rozhranie, bez ohľadu na to, ktorý formulár sa tlačí.

Spoločné rysy, individualita a voľba:
Niektoré knihy píšu, že C# odporúča používať rozhrania namiesto abstraktných základných tried a zdôrazňujú mnohé výhody používania rozhraní, s ktorými sa neodvážim nesúhlasiť. Z vyššie uvedeného zoznamu stále existuje mnoho rozdielov medzi týmito dvoma a existencia tohto rozdielu musí určovať rozdiel v použiteľných scenároch, napríklad abstraktná základná trieda môže poskytnúť predvolené implementácie pre niektoré metódy, aby sa predišlo opakovanej implementácii v podtriedach a zlepšila znovupoužiteľnosť kódu. To je výhoda abstraktných tried; Rozhranie môže obsahovať iba abstraktné metódy. Čo sa týka toho, kedy používať abstraktné základné triedy a kedy používať rozhrania, závisí to od toho, ako používatelia vnímajú spojenia medzi zdedenými triedami, či ide o rozdiely v osobnosti alebo spoločné spojenia medzi nimi. Dovoľte mi to ilustrovať príkladom zo života.

Ak dostanete tri objekty, konkrétne ľudí, ryby a žaby, a požiadate vás, aby ste navrhli základnú kategóriu, ktorá zhrnie ich spojenie, prvá vec, ktorú pocítite, je, že medzi nimi sú veľké rozdiely a je ťažké abstrahovať spoločné znaky. Tu by ste mali zvážiť použitie rozhraní namiesto abstraktných základných tried z troch dôvodov:
1. Individualita je väčšia než spoločná identita.
2. Osobnosti s veľkými rozdielmi majú niektoré rovnaké správanie.
3. Existujú veľké rozdiely v metódach realizácie toho istého správania.
V tomto momente dostanete ďalšie tri objekty, konkrétne kapra, kapra a zlatú rybku, a stále môžete navrhovať základné triedy, aby ste zhrnuli spojenie medzi nimi, potom prvá vec, ktorú si uvedomíte, je, že všetky patria rybám, a druhá je, že spôsob plávania môže byť mierne odlišný, takže by ste mali používať abstraktné základné triedy namiesto rozhraní, v porovnaní s vyššie uvedeným príkladom sú tri dôvody:
1. Spoločné vlastnosti sú väčšie než individualita
2. Jedinci s rovnakou spoločnosťou musia mať rovnaké vlastnosti a správanie
3. Existujú určité rozdiely v metódach implementácie toho istého správania
Medzi viacerými dôvodmi na používanie rozhraní alebo abstraktných základných tried je tretí dôvod v skutočnosti rovnaký, ktorý opisuje koncept polymorfizmu v objektovo orientovanom, teda implementuje sa prepísaním rodičovskej triedy a volaním zodpovedajúcej metódy za behu podľa odovzdanej objektovej referencie. Druhý dôvod sa začína rozchádzať, pričom rozhrania zdôrazňujú rovnaké správanie medzi zdedenými objektmi, zatiaľ čo abstraktné triedy tiež zdôrazňujú rovnaké vlastnosti medzi zdedenými objektmi. Čo naozaj odlišuje rozhrania od abstraktných základných tried, sú nasledujúce dôvody:

Rozhrania sa používajú, keď sa hľadá funkčná spoločnosť medzi objektmi s veľkými rozdielmi.
Abstraktné základné triedy sa používajú, keď sa hľadajú funkčné rozdiely medzi objektmi s väčšou spoločnosťou.
Porovnávaním rovnakého a odlišného môžeme len povedať, že rozhrania a abstraktné triedy majú svoje silné stránky, ale žiadne výhody. V skutočnej programátorskej praxi musíme merať naše schopnosti podľa konkrétnej situácie, ale nasledujúce skúsenosti a nahromadenie vám môžu poskytnúť inšpiráciu, okrem niektorých mojich skúseností mnohé z nich pochádzajú z klasiky, verím, že obstoja v skúške. Takže pri pravidlách a príležitostiach, keď sa učíme tieto klasiky, najdôležitejšie je aplikovať to, čo sme sa naučili, samozrejme, všetkých si získam slovami rodiny, prosím, pokračujte.

Pravidlá a príležitosti:
1. Pamätajte, že jedným z najdôležitejších princípov objektovo orientovaného myslenia je: programovanie orientované na rozhranie.
2. S pomocou rozhraní a abstraktných tried bolo mnoho myšlienok v 23 dizajnových vzoroch šikovne implementovaných a myslím, že ich podstatou je jednoducho orientácia na abstraktné programovanie.
3. Abstraktné triedy by sa mali používať hlavne pre úzko súvisiace objekty, zatiaľ čo rozhrania sú najlepšie na poskytovanie všeobecnej funkcionality pre irelevantné triedy.
4. Rozhranie sa zameriava na typ vzťahu CAN-DO, zatiaľ čo abstraktná trieda sa zameriava na vzťah IS-A.
5. Správanie multidefinovaných objektov v rozhraní; abstraktné triedy multidefinujú vlastnosti objektov;
6. Definície rozhraní môžu používať verejné, chránené, interné a súkromné modifikátory, ale takmer všetky rozhrania sú definované ako verejné, takže nie je potrebné dodávať viac.
7. "Rozhranie zostáva nezmenené" je dôležitý faktor, ktorý treba zvážiť. Preto pri pridávaní rozšírení z rozhraní by sa mali pridávať nové rozhrania, nie existujúce.
8. Snažte sa navrhnúť rozhranie ako funkčný blok s jednou funkciou, vezmite ako príklad .NET Framework, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable a ďalšie obsahujú len jednu spoločnú metódu.
9. Veľké písmeno "I" pred názvom rozhrania je konvencia, rovnako ako názov poľa začína podčiarknutím, prosím, dodržiavajte tieto princípy.
10. V rozhraní sú všetky metódy predvolene verejné.
11. Ak sa očakávajú problémy s verziou, môžete vytvoriť "abstraktnú triedu". Napríklad, ak vytvoríte psa, sliepku a kačku, mali by ste zvážiť abstrahovanie zvierat, aby ste sa vysporiadali s vecami, ktoré môžu vzniknúť v budúcnosti. Pridanie nových členov do rozhrania núti všetky odvodené triedy meniť a znovu kompilovať, takže verziologické problémy sú najlepšie implementované pomocou abstraktných tried.
12. Neabstraktné triedy odvodené z abstraktných tried musia zahŕňať všetky zdedené abstraktné metódy a skutočné implementácie abstraktných accessorov.
13. Nové kľúčové slovo sa nedá použiť pre abstraktné triedy, ani ich nemožno zapečatiť, pretože abstraktné triedy nie je možné inštancionovať.
14. Statické alebo virtuálne modifikátory nemožno použiť v abstraktných deklaráciách metód.





Predchádzajúci:C# Enum Simple Permission Design používa vlastnosť FlagsAttribute
Budúci:Huang Yongova trieda Yiyun má nulové pochopenie mini programu WeChat
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com