Abstraktní třída a rozhraní v C #

Anonim

Abstraktní třída vypadá spíše jako rozhraní, ale koncept je pro začátečníky OOP trochu matoucí. Koncepčně, abstraktní třída vypadá stejně jako rozhraní samozřejmě bez jakékoli implementace, nicméně mají svůj spravedlivý rozdíl. Zatímco abstraktní třída může být částečně nebo plně implementována, rozhraní musí být zcela implementováno. Nejvíce pozoruhodný rozdíl mezi těmito dvěma je, že abstraktní třída může mít výchozí implementaci, zatímco rozhraní je pouze definicí metod, které obsahují pouze členské prohlášení. Představme si teoretické aspekty obou detailů.

Co je to abstraktní třída?

Abstraktní třída je zvláštní typ třídy, která působí jako základna jiných tříd a nemůže být instancována. Implementační logiku abstraktní třídy zajišťují její odvozené třídy. Pro vytvoření abstraktní třídy se používá "abstraktní" modifikátor, což znamená, že v odvozené třídě je třeba implementovat chybějící implementaci. Obsahuje abstraktní i neabstraktní členy. Abstraktní třída je určena k poskytování základních funkcí, které mohou být dále sdíleny a nahrazovány více odvozenými třídami. Je vhodné vyhnout se jakémukoliv duplikátu kódu. Vypadají velmi podobně jako rozhraní, ale mají přidanou funkcionalitu.

Co je to rozhraní?

Rozhraní, na druhé straně, není třída, která obsahuje pouze podpis funkčnosti. Je to model bez implementace. Koncepčně řečeno, je to jen definice metod, která obsahuje pouze prohlášení členů. Je to prázdný shell, který neobsahuje implementaci svých členů. Je to jako abstraktní základní třída, která obsahuje pouze abstraktní členy, jako jsou metody, události, indexátory, vlastnosti atd. Nemůže být přímo konkretizována a její členové mohou být implementováni libovolnou třídou. Navíc může být více rozhraní implementováno třídou, nicméně třída může dědit pouze jednu třídu.

Abstraktní třída vs. rozhraní: rozdíl mezi abstraktní třídou a rozhraním v C #

  1. Vícenásobné dědictví - Třída může používat pouze jednu abstraktní třídu, takže více dědičnosti není podporováno. Na druhou stranu rozhraní může podporovat více dědictví, což znamená, že třída může dědit libovolný počet dědictví.
  2. Definice z Abstraktní třída a rozhraní v C #- Abstraktní třída je zvláštní typ třídy, která může obsahovat definici bez implementace. Implementační logika poskytuje její odvozené třídy. Může mít abstraktní i neabstraktní metody. Rozhraní, na druhé straně, je jen vzorem, který nemůže nic dělat. Technicky je to jen prázdná skořápka.
  3. Implementace - Abstraktní třída může obsahovat definici i její implementaci. Je to neúplná třída, kterou nelze konkretizovat. Rozhraní může mít pouze podpis funkce bez jakéhokoli kódu.
  4. Modifikátory přístupu - Abstraktní třída může mít několik modifikátorů přístupu, jako jsou subsystémy, funkce, vlastnosti atd., Zatímco rozhraní nemá povoleno mít modifikátory přístupu a všechny metody musí být implicitně definovány jako veřejné.
  5. Homogenita - abstraktní třída se používá pro implementace stejného typu, chování a stavu, zatímco rozhraní se používá pro implementace, které sdílejí pouze podpisy metod.
  6. Prohlášení - Abstraktní třída funguje jako základní třída pro všechny ostatní třídy, takže může deklarovat nebo používat libovolnou proměnnou, zatímco rozhraní není povoleno deklarovat žádné proměnné.
  7. Vyhlášení konstruktora - Zatímco abstraktní třída může mít prohlášení konstruktora, rozhraní nemůže mít deklaraci konstruktora.
  8. Core vs. Peripheral - Abstraktní třída se používá k definování základní identity třídy a může být použita pro objekty stejného datového typu. Na druhé straně rozhraní slouží k definování periferní schopnosti třídy.
  9. Pevný vs. plný - Abstraktní třída je více pružná, pokud jde o funkčnost, přinejmenším z hlediska vývojáře, zatímco rozhraní je tužší.

Abstraktní třída vs. rozhraní: Formulář tabulky

Abstraktní třída

Rozhraní

Abstraktní třída může mít všechny modifikátory přístupu pro členové prohlášení o funkcích, podsouborech a vlastnostech. Rozhraní není povoleno mít modifikátory přístupu pro členskou deklaraci funkcí, subs, vlastností atd. Všichni členové jsou předpokládáni jako implicitně veřejní.
Třída může nejvíce používat pouze jednu abstraktní třídu. Třída může dědit libovolný počet rozhraní.
Vícenásobné dědění není v abstraktní třídě podporováno. Rozhraní může podporovat více dědičnosti.
Technicky je to třída, která může nebo nemusí obsahovat definici i její implementaci. Rozhraní může mít pouze podpis funkce, takže je v podstatě prázdný shell.
Abstraktní třída může obsahovat členy. konsts, definované metody a metodické bloky. Rozhraní může obsahovat pouze metody a konsty.
Definuje základní identitu třídy a používá se k popisu objektů stejného datového typu. Používá se k popisu periferních schopností třídy.
Členové abstraktní třídy nemohou být statickí, pokud nejsou úplní členové. Členové rozhraní nemohou být statické.
Je ideální pro implementace stejného druhu a společného chování. Je lepší používat rozhraní, pokud několik implementací sdílí pouze podpisy metod.
Může mít prohlášení konstruktora. Nemůže mít prohlášení konstruktora.
Abstraktní třída obsahuje předdefinovaná pole a konstanta. Pole nelze definovat v rozhraní.
Může mít abstraktní i neabstraktní metody. Může mít pouze abstraktní metody.

souhrn

Jaký je rozdíl mezi abstraktní třídou a rozhraním? To je pravděpodobně jeden z nejčastějších otázek kladených v každém technickém rozhovoru. Pravděpodobně najdeš spoustu informací o abstraktních třídách a rozhraních v jakémkoliv tutoriálu C #, nicméně pochopení rozdílu mezi těmito dvěma je poměrně těžké. Můžete shromáždit všechny informace, které můžete najít a stále se vám nedostane. No, koncepčně jsou oba nejdůležitější termíny v programování a jsou docela stejné, nicméně se liší hodně z hlediska funkčnosti. Zatímco abstraktní třída je speciálním typem třídy, která působí jako základna pro jiné třídy, rozhraní je naopak prázdnou skořicí pouze s členskými prohlášeními.