Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 18805|Odpověď: 0

[Komunikace] Podobnosti a rozdíly mezi virtuálním a (abstraktním) abstraktem a rozhraním v C#...

[Kopírovat odkaz]
Zveřejněno 22.04.2019 14:41:09 | | |
Interpretace 1

V C# jsou abstraktní a virtuální zmatení, oba související s dědičností a vyžadují použití přepisování. Pojďme si probrat rozdíly mezi těmito dvěma:

1. Virtuální metoda

virtuální klíčové slovo se používá k úpravě metod v základní třídě. Existují dvě situace, kdy se používá virtuální prostředí:

Scénář 1: Virtuální metoda je definována v základní třídě, ale virtuální metoda není přepsána v odvozené třídě. Při volání instance odvozené třídy používá virtuální metoda metodu definovanou základní třídou.

Scénář 2: V základní třídě je definována virtuální metoda a poté je metoda přepsána pomocí přepisování v odvozené třídě. Při volání odvozené instance třídy virtuální metoda používá odvozenou metodu přepisu.

2. Abstraktní metoda (abstraktní metoda)

Abstraktní klíčové slovo lze použít pouze v abstraktních třídách k úpravě metod a neexistuje žádná konkrétní implementace. Implementace abstraktních metod musí být implementována pomocí přepisovacího klíčového slova v odvozené třídě.

Nejdůležitější rozdíl mezi rozhraním a abstraktní třídou: abstraktní třída je neúplná třída, abstrakce objektu, zatímco rozhraní je behaviorální norma.


3. Klíčová slova

Statické: Když je metoda deklarována jako statická, je statická a překladač ponechává implementaci metody v době kompilace. To znamená, že metoda patří ke třídě, ale ne k žádnému členovi, bez ohledu na to, zda instance této třídy existuje či nikoliv. Stejně jako vstupní funkce Static void Main, protože je statickou funkcí, lze ji volat přímo.

Virtua: Když je metoda deklarována jako Virtuální, jedná se o virtuální metodu, dokud nepoužijete proměnnou ClassName = nový ClassName(); Před deklarací instance třídy neexistuje v reálném paměťovém prostoru. Toto klíčové slovo se velmi často používá při dědičnosti tříd k podpoře polymorfismu pro metody tříd.

přepisovat: označuje přepis Tato třída dědí z třídy Shape
Virtuální, abstraktní znamená říct ostatním třídám, které chtějí dědit od něj, že můžete tuto mou metodu nebo vlastnost přepsat, jinak to není povoleno.
Abstrakt: Deklarace abstraktní metody je metoda, kterou musí přepsat odvozená třída, která se používá k dědictví; Lze ji považovat za imaginární metodu bez realizace; Pokud třída obsahuje abstraktní metodu, musí být definována jako abstraktní třída, ať už obsahuje jiné obecné metody, nebo ne; Abstraktní třídy nemohou mít substance.

a) Metoda virtuální modifikace musí mít implementaci metody (i když jde pouze o pár závorek) a metoda abstraktní modifikace nemůže mít implementaci.

b) virtuální může být přepsán podtřídami, abstraktní musí být přepsán podtřídami

c) Pokud je funkce v třídě upravena abstactem, musí být název třídy také upraven abstact

d) Abstraktně upravené třídy nelze vytvářet instance.

e) Pokud je metoda v C# připravena přepsat nadřazenou třídu v podtřídě, musí být metoda upravena tak, že je virtuální v nadřazené třídě a přehlížet v podtřídě, aby se zabránilo tomu, že programátor omylem přepsal rodičovskou metodu nadřazené třídy v podtřídě.

Poznámka: Třídy upravené abstraktem lze pouze dědit, nikoli instancovat.

Interpretace 2

K úpravě třídy rodiče se používají jak virtuální, tak abstraktní, což umožňuje redefinovat podtřídu přepsáním definice nadřazené třídy.

Mají jednu společnou vlastnost: pokud se používají k úpravě metod, musí být před nimi přidáno veřejné, jinak dojde k chybám při kompilaci: virtuální metody nebo abstraktní metody nemohou být soukromé. Koneckonců, přidání virtuálního nebo abstraktního označení umožňuje redefinovat podtřídu a soukromé členy nelze podtřídě přístupovat.

Ale jsou velmi odlišné. (virtuální znamená "virtuální", abstraktní je "abstraktní").

(1) Metoda virtuální modifikace musí být implementována (i když přidává pouze pár závorek), zatímco metoda abstraktní modifikace nesmí být implementována. Například pokud není implementována metoda virtuální modifikace:

Chyba: "Test1.fun1()" musí deklarovat tělo, protože není označeno jako abstraktní, externí nebo částečné   

Pro abstraktní modifikátory, pokud jsou implementovány:


Chyba: "Test2.fun2()" nemůže deklarovat tělo, protože je označeno jako abstraktní   

(2) virtuální může být přepsán podtřídami, zatímco abstraktní musí být přepsán podtřídami.
Při kompilaci není chyba, pokud je metoda virtuálního modifikátoru přepsána, musí být před ní přidán override (který kompilátoru sděluje, že chcete přepsat virtuální metodu) a musí existovat implementace, jinak bude kompilace špatná:
(3) Pokud je člen třídy upraven abstraktem, musí být abstrakt přidán před třídou, protože abstraktní metody mohou mít pouze abstraktní třídy.

(4) Instance abstraktních tříd nelze vytvářet, lze je pouze dědit a nelze je instancionovat, například: BaseTest2 base2 = nový BaseTest2(); Dojde k chybě při kompilaci: Abstraktní třída nebo rozhraní nemůže vytvořit instanci.

(5) V C#, pokud chcete přepsat metodu v podtřídě, musíte přidat virtuální před nadřazenou metodou a přepsat před podtřídou, abyste předešli tomu, že programátoři omylem přepsou nadřazenou metodu v podtřídě.

(6) Abstraktní metoda musí být přepsána a virtuální metoda musí mít implementaci (i když je definována v abstraktní třídě).
Interpretace 3
Podobnosti:
1. Všechny mohou být děděné
2. Žádná z nich nemůže být instancována
3. Může obsahovat deklarace metod
4. Odvozené třídy musí implementovat nerealizované metody
Rozlišit:
1. Abstraktní základní třídy mohou definovat pole, atributy a implementace metod. Rozhraní mohou definovat pouze atributy, indexery, události a deklarace metod a nemohou obsahovat pole.
2. Abstraktní třída je neúplná třída, kterou je třeba dále zpřesnit, zatímco rozhraní je behaviorální norma. Vlastní rozhraní Microsoftu vždy obsahují schopné pole, které dokazuje, že jsou vyjádřením "Já to zvládnu..." ”
3. Rozhraní lze implementovat vícekrát a abstraktní třídy může zdědit pouze jedna osoba
4. Abstraktní třídy jsou více definovány mezi řadou úzce souvisejících tříd, zatímco většina rozhraní je volně propojená, ale všechny implementují určitou funkci
5. Abstraktní třídy jsou pojmy abstrahované ze série souvisejících objektů, takže odrážejí vnitřní společné rysy věcí; Rozhraní je funkční konvence definovaná tak, aby vyhovovala externím voláním, takže odráží vnější charakteristiky věcí
6. Rozhraní v podstatě nemá žádné specifické vlastnosti dědičnosti, pouze slibuje metodu, kterou lze nazývat
7. Rozhraní lze použít k podpoře callbacků, ale dědičnost tuto funkci nemá
8. Specifické metody implementované abstraktními třídami jsou ve výchozím nastavení virtuální, ale rozhraní v třídě, která rozhraní implementuje, jsou ve výchozím nastavení nevirtuální, samozřejmě je můžete také deklarovat jako virtuální
9. Pokud abstraktní třída implementuje rozhraní, lze metodu v rozhraní mapovat na abstraktní třídu jako abstraktní metodu bez nutnosti její implementace, ale metoda v rozhraní může být implementována v podtřídě abstraktní třídy
Pravidla použití:
1. Abstraktní třídy se používají především pro úzce související objekty, zatímco rozhraní jsou nejlepší pro poskytování obecné funkčnosti pro irelevantní třídy
2. Pokud chcete navrhnout velkou funkční jednotku, použijte abstraktní třídy; Pokud chcete navrhovat malé, stručné funkční bloky, použijte rozhraní.
3. Pokud se očekává vytvoření více verzí komponenty, vytvořte abstraktní třídu. Jakmile je rozhraní vytvořeno, nelze ho změnit. Pokud je potřeba nová verze rozhraní, musí být vytvořeno zcela nové rozhraní.
4. Pokud bude vytvořená funkce použita mezi širokou škálou heterogenních objektů, použijte rozhraní; Pokud chcete poskytnout společnou implementovanou funkcionalitu napříč všemi implementacemi komponenty, použijte abstraktní třídy.
5. Analyzovat objekt, zpřesnit vnitřní společnost tak, aby vznikla abstraktní třída, která slouží k vyjádření podstaty objektu, tedy "čeho". Rozhraní jsou prioritizována, když je třeba rozšířit externí volání nebo funkce
6. Dobrá definice rozhraní by měla být specifická a funkční, nikoli multifunkční, jinak způsobí znečištění rozhraní. Pokud třída implementuje pouze jednu funkci rozhraní, ale musí implementovat jiné metody v rozhraní, nazývá se to znečištění rozhraním
7. Snažte se vyhnout dědičnosti k dosažení formační funkce, ale použijte černou skříňku multiplexování, tedy kombinaci objektů. Kvůli nárůstu počtu dědičných úrovní je nejpřímějším důsledkem to, že když vyvoláte třídu v tomto taxonu, musíte je všechny načíst do zásobníku! Důsledky si lze představit. (Kombinované s pochopením principů zásobníků). Zároveň si zájemci všimnou, že Microsoft často používá metodu kombinace objektů při tvorbě třídy. Například v asp.net má třída Page vlastnosti jako Server Request, ale ve skutečnosti jsou všechny objekty určité třídy. Použití tohoto objektu třídy Page k volání metod a vlastností jiných tříd je velmi základní princip návrhu
Například:
Window forms lze navrhovat s abstraktními třídami a veřejné operace a vlastnosti lze umístit do abstraktní třídy, takže formulář a dialogové okno mohou z této abstraktní třídy přecházet a rozšiřovat a zlepšovat podle svých potřeb.

Tisková operace může být poskytnuta jako rozhraní ke každému formuláři, který tuto funkci potřebuje, protože obsah formuláře je odlišný a musí si podle svých požadavků implementovat vlastní tiskovou funkci. Při tisku je volán pouze přes rozhraní, bez ohledu na to, který formulář se tiskne.

Společné rysy, individualita a volba:
Některé knihy píší, že C# doporučuje používat rozhraní místo abstraktních základních tříd a zdůrazňují mnoho výhod používání rozhraní, s čímž nemohu nesouhlasit; z výše uvedeného seznamu stále existuje mnoho rozdílů mezi těmito dvěma a existence tohoto rozdílu musí určit rozdíl v použitelných scénářích, například abstraktní základní třída může poskytnout výchozí implementace pro některé metody, aby se zabránilo opakované implementaci v podtřídách a zlepšila znovupoužitelnost kódu. To je výhoda abstraktních tříd; Rozhraní může obsahovat pouze abstraktní metody. Pokud jde o to, kdy používat abstraktní základní třídy a kdy používat rozhraní, záleží na tom, jak uživatelé vnímají spojení mezi zděděnými třídami, zda jde o osobnostní rozdíly nebo společné vazby mezi nimi. Dovolte mi to ilustrovat příkladem ze života.

Pokud dostanete tři objekty, konkrétně lidi, ryby a žáby, a jste požádáni, abyste navrhli základní kategorii, která shrne jejich propojení, pak první věc, kterou ucítíte, je, že mezi nimi jsou velké rozdíly a je těžké abstrahovat společné rysy. Právě zde byste měli zvážit použití rozhraní místo abstraktních základních tříd ze tří důvodů:
1. Individualita je větší než společné věci.
2. Osobnosti s velkými rozdíly mají některé stejné chování.
3. Existují velké rozdíly v metodách realizace stejného chování.
V tuto chvíli dostanete tři další objekty, konkrétně kapra, kapra a zlatou rybku, a stále můžete navrhnout základní třídy, které shrnují propojení mezi nimi, pak první věc, kterou si uvědomíte, je, že všechny patří rybám, a druhá je, že způsob plavání může být trochu odlišný, takže byste měli používat abstraktní základní třídy místo rozhraní, ve srovnání s výše uvedeným příkladem jsou tři důvody:
1. Společné rysy jsou větší než individualita
2. Jedinci se stejnou společností musí mít stejné vlastnosti a chování
3. Existují určité rozdíly v metodách implementace stejného chování
Mezi několika důvody pro použití rozhraní nebo abstraktních základních tříd je třetí důvod ve skutečnosti stejný, který popisuje koncept polymorfismu v objektově orientovaném, tedy je implementován přepsáním rodičovské třídy a voláním odpovídající metody za běhu podle předané objektové reference. Druhý důvod se začíná rozcházet, rozhraní zdůrazňují stejné chování mezi dědičnými objekty, zatímco abstraktní třídy také zdůrazňují stejné vlastnosti mezi děděnými objekty. Co skutečně odlišuje rozhraní od abstraktních základních tříd, jsou následující důvody:

Rozhraní se používají, když se hledá funkční společnost mezi objekty s velkými rozdíly.
Abstraktní základní třídy se používají, když se hledají funkční rozdíly mezi objekty s větší společností.
Porovnáním stejného a odlišného lze pouze říci, že rozhraní a abstraktní třídy mají své vlastní silné stránky, ale žádné výhody nejsou. V praxi programování musíme měřit své schopnosti podle konkrétní situace, ale následující zkušenosti a nasbírání vám mohou poskytnout inspiraci, kromě některých mých zkušeností mnoho z nich pochází z klasiky, věřím, že obstojí v testu. Takže v pravidlech a příležitostech, kdy se učíme tyto klasiky, nejdůležitější je aplikovat to, co jsme se naučili, samozřejmě, získám smích všech slovy rodiny, prosím, pokračujte.

Pravidla a příležitosti:
1. Pamatujte, že jedním z nejdůležitějších principů objektově orientovaného myšlení je: programování orientované na rozhraní.
2. S pomocí rozhraní a abstraktních tříd bylo mnoho nápadů v 23 designových vzorech chytře implementováno a myslím, že jejich podstatou je jednoduše orientace na abstraktní programování.
3. Abstraktní třídy by měly být primárně používány pro úzce související objekty, zatímco rozhraní jsou nejlepší pro obecnou funkčnost pro irelevantní třídy.
4. Rozhraní se zaměřuje na typ vztahu CAN-DO, zatímco abstraktní třída se zaměřuje na vztah IS-A.
5. Chování vícedefinovaných objektů v rozhraní; abstraktní třídy multidefinují vlastnosti objektů;
6. Definice rozhraní mohou používat veřejné, chráněné, interní a soukromé modifikátory, ale téměř všechna rozhraní jsou definována jako veřejná, takže není třeba dodávat další informace.
7. "Rozhraní zůstává beze změny" je důležitý faktor, který je třeba zvážit. Proto by při přidávání rozšíření z rozhraní měla být přidána nová rozhraní, nikoli existující.
8. Snažte se navrhnout rozhraní jako funkční blok s jedinou funkcí, například .NET Framework, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable atd. obsahují pouze jednu společnou metodu.
9. Velké písmeno "I" před názvem rozhraní je konvencí, stejně jako název pole začíná podtržítkem, dodržujte prosím tyto principy.
10. V rozhraní všechny metody automaticky přecházejí na veřejné.
11. Pokud se očekává problém s verzí, můžete vytvořit "abstraktní třídu". Například pokud vytvoříte psa, slepici a kachně, měli byste zvážit abstrakci zvířat, aby se vypořádali s věcmi, které se mohou v budoucnu objevit. Přidání nových členů do rozhraní nutí všechny odvozené třídy upravovat a znovu kompilovat, takže verze jsou nejlépe implementovány pomocí abstraktních tříd.
12. Neabstraktní třídy odvozené z abstraktních tříd musí zahrnovat všechny zděděné abstraktní metody a skutečné implementace abstraktních přístupů.
13. Nové klíčové slovo nelze použít pro abstraktní třídy, ani je nelze zapečetit, protože abstraktní třídy nelze instancovat.
14. Statické nebo virtuální modifikátory nelze použít v abstraktních deklaracích metod.





Předchozí:C# Enum Simple Permission Design používá vlastnost FlagsAttribute
Další:Huang Yongova třída Yiyun má nulové porozumění mini programu WeChat
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com