Rozdíl mezi abstraktní třídou a rozhraním v C #

Abstraktní třída vypadá hodně jako rozhraní, ale koncept je pro začátečníky OOP trochu matoucí. Koncepčně vypadá abstraktní třída jako rozhraní, samozřejmě, bez jakékoli implementace, mají však spravedlivý podíl na rozdílech. I když abstraktní třída může být implementována částečně nebo plně, rozhraní musí být implementováno úplně. Nejvýznamnějším rozdílem mezi těmito dvěma je, že abstraktní třída může mít implicitní implementaci, zatímco rozhraní je pouze definice metod, která obsahuje pouze prohlášení členů. Pojďme podrobně diskutovat o teoretických aspektech obou.

Co je abstraktní třída?

Abstraktní třída je speciální typ třídy, který funguje jako základna jiných tříd a nelze jej vytvořit. Logika implementace abstraktní třídy je poskytována odvozenými třídami. Aby se třída stala abstraktem, používá se „abstraktní“ modifikátor, což znamená, že některé chybějící implementace musí být implementovány do třídy, která je z ní odvozena. Obsahuje jak abstraktní, tak ne abstraktní členy. Abstraktní třída má poskytovat základní funkce, které mohou být dále sdíleny a přepsány několika odvozenými třídami. Je užitečné vyhnout se jakékoli duplicitě kódu. Vypadají velmi podobně jako rozhraní, ale s přidanou funkčností.

Co je rozhraní?

Rozhraní na druhé straně není třídou, která obsahuje pouze podpis funkčnosti. Je to vzor bez implementace. Z koncepčního hlediska je to pouze definice metod, která obsahuje pouze prohlášení členů. Je to prázdný shell, který neobsahuje implementaci jeho členů. Je to jako abstraktní základní třída, která obsahuje pouze abstraktní členy, jako jsou metody, události, indexery, vlastnosti atd. Nelze přímo vytvořit instanci a její členy mohou implementovat libovolné třídy. Třída může navíc implementovat více rozhraní, třída však může zdě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, a proto není podporováno vícenásobné dědictví. Rozhraní, na druhé straně, může podporovat vícenásobnou dědičnost, což znamená, že třída může zdědit libovolný počet dědic.
  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. Logika implementace je poskytována odvozenými třídami. Může mít abstraktní i ne abstraktní metody. Rozhraní, na druhé straně, je jen vzor, ​​který nemůže nic dělat. Technicky je to jen prázdná skořápka.
  3. Implementace - Abstraktní třída může obsahovat jak definici, tak její implementaci. Je to neúplná třída, kterou nelze vytvořit. Rozhraní může mít podpis funkce pouze bez kódu.
  4.  Modifikátory přístupu - Abstraktní třída může mít několik modifikátorů přístupu, jako jsou subs, funkce, vlastnosti atd., Zatímco rozhraní nesmí 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 signatury 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žít libovolnou proměnnou, zatímco rozhraní nesmí deklarovat žádné proměnné.
  7. Prohlášení konstruktéra - Zatímco abstraktní třída může mít prohlášení konstruktoru, rozhraní nemůže mít prohlášení konstruktoru.
  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. Rozhraní, na druhé straně, je používáno definovat periferní schopnost třídy.
  9. Tuhý vs. pružný - Abstraktní třída je pružnější z hlediska funkčnosti, alespoň z pohledu vývojáře, zatímco rozhraní je rigidnější.

Abstraktní třída vs. rozhraní: Tabulka

Abstraktní třída

Rozhraní

Abstraktní třída může mít všechny modifikátory přístupu pro deklaraci funkcí členů, dílčích a vlastností členů. Rozhraní nesmí mít modifikátory přístupu pro deklaraci funkcí členů, dílčích vlastností, vlastností atd. Všichni členové jsou považováni za implicitně veřejné.
Třída může nanejvýš použít pouze jednu abstraktní třídu. Třída může zdědit libovolný počet rozhraní.
V abstraktní třídě není podporováno vícenásobné dědictví. Rozhraní může podporovat vícenásobné dědictví.
Technicky jde o třídu, která může nebo nemusí obsahovat jak definici, tak její implementaci. Rozhraní může mít pouze podpis funkčnosti, takže je to v podstatě prázdný shell.
Abstraktní třída může obsahovat členy. consts, definované metody a metody stubs. Rozhraní může obsahovat pouze metody a konstanty.
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 statičtí, pokud to není úplný člen. Členové rozhraní nemohou být statické.
Je ideální pro implementace stejného druhu a běžného chování. Je lepší používat rozhraní, pokud několik implementací sdílí pouze signatury metod.
Může mít prohlášení konstruktéra. Nemůže mít prohlášení konstruktéra.
Abstraktní třída má předdefinovaná pole a konstanty. Pole nelze definovat v rozhraní.
Může mít abstraktní i ne abstraktní metody. Může mít pouze abstraktní metody.

souhrn

Jaký je rozdíl mezi abstraktní třídou a rozhraním? Toto je pravděpodobně jedna z nejčastějších otázek položených v každém technickém rozhovoru. Pravděpodobně najdete nepřeberné množství informací o abstraktních třídách a rozhraních v jakémkoli tutoriálu C #, pochopení rozdílu mezi nimi je však docela těžká část. Můžete sloučit všechny informace, které můžete najít, a stále nemůžete získat dost. Koncepčně jsou oba nejdůležitější pojmy v programování a jsou si naprosto stejné, liší se však funkčností. Zatímco abstraktní třída je zvláštní typ třídy, která funguje jako základna pro jiné třídy, rozhraní je naproti tomu jen prázdnou schránkou s pouze deklaracemi členů..