Abstraktná trieda vyzerá podobne ako rozhranie, ale koncept je pre začiatočníkov OOP trochu mätúci. Z koncepčného hľadiska abstraktná trieda vyzerá rovnako ako rozhranie, samozrejme, bez akejkoľvek implementácie, majú však spravodlivý podiel na rozdieloch. Hoci abstraktná trieda môže byť implementovaná čiastočne alebo úplne, rozhranie musí byť implementované úplne. Najvýznamnejším rozdielom medzi nimi je to, že abstraktná trieda môže mať predvolenú implementáciu, zatiaľ čo rozhranie je iba definícia metód, ktorá obsahuje iba deklarácie členov. Poďme sa podrobne venovať teoretickým aspektom oboch.
Abstraktná trieda je špeciálny typ triedy, ktorý funguje ako základňa iných tried a nemôže byť konkretizovaný. Logiku implementácie abstraktnej triedy poskytujú jej odvodené triedy. Na vytvorenie abstraktu triedy sa používa „abstraktný“ modifikátor, čo znamená, že niektoré chýbajúce implementácie je potrebné implementovať do triedy, ktorá je z nej odvodená. Obsahuje abstraktné aj neregistrované členy. Abstraktná trieda je určená na poskytovanie základných funkcií, ktoré môžu ďalej zdieľať a prepísať viaceré odvodené triedy. Je užitočné vyhnúť sa akémukoľvek duplikovaniu kódu. Vyzerajú veľmi podobne ako rozhrania, ale s pridanou funkčnosťou.
Rozhranie, na druhej strane, nie je trieda, ktorá obsahuje iba podpis funkčnosti. Je to vzor bez implementácie. Z koncepčného hľadiska je to iba definícia metód, ktorá obsahuje iba vyhlásenie členov. Je to prázdny shell, ktorý neobsahuje implementáciu svojich členov. Je to ako abstraktná základná trieda, ktorá obsahuje iba abstraktné členy, ako sú metódy, udalosti, ukazovatele, vlastnosti atď. Nemôže byť priamo vytvorená inštancia a jej členovia môžu byť implementovaní akoukoľvek triedou. Trieda môže implementovať aj viac rozhraní, ale trieda môže zdediť iba jednu triedu.
Abstraktná trieda | Rozhranie |
Abstraktná trieda môže mať všetky modifikátory prístupu pre deklaráciu funkcií, vedľajších hodnôt a vlastností členov. | Rozhranie nemá povolené modifikátory prístupu na deklarovanie funkcií členov, podskupín, vlastností atď. Všetci členovia sa považujú za implicitne verejné. |
Trieda môže nanajvýš používať iba jednu abstraktnú triedu. | Trieda môže zdediť ľubovoľný počet rozhraní. |
V abstraktnej triede nie je podporované viacnásobné dedičstvo. | Rozhranie môže podporovať viacnásobné dedičstvo. |
Technicky je to trieda, ktorá môže alebo nemusí obsahovať definíciu aj jej implementáciu. | Rozhranie môže mať iba podpis funkčnosti, takže v podstate ide o prázdny shell. |
Abstraktná trieda môže obsahovať členov. consts, definované metódy a metódy pahýly. | Rozhranie môže obsahovať iba metódy a konštanty. |
Definuje jadrovú identitu triedy a používa sa na opis objektov rovnakého typu údajov. | Používa sa na opis periférnych schopností triedy. |
Členovia abstraktnej triedy nemôžu byť statickí, pokiaľ nejde o úplného člena. | Členovia rozhrania nemôžu byť statické. |
Je ideálny pre implementácie rovnakého druhu a bežného správania. | Je lepšie používať rozhrania, ak niekoľko implementácií zdieľa iba podpisy metód. |
Môže mať vyhlásenie výrobcu. | Nemôže mať vyhlásenie konštruktora. |
Abstraktná trieda má preddefinované polia a konštanty. | Polia nemôžu byť definované v rozhraniach. |
Môže mať tak abstraktné, ako aj ne abstraktné metódy. | Môže mať iba abstraktné metódy. |
Aký je rozdiel medzi abstraktnou triedou a rozhraním? Toto je pravdepodobne jedna z najbežnejších otázok položených pri každom technickom rozhovore. Pravdepodobne nájdete nepreberné množstvo informácií o abstraktných triedach a rozhraniach v každom výučbe C #, pochopenie rozdielu medzi nimi je však dosť ťažká časť. Môžete zjednotiť všetky informácie, ktoré nájdete, a stále ich nemôžete získať dosť. Koncepčne sú obidva najdôležitejšie pojmy v programovaní a sú úplne rovnaké, líšia sa však z hľadiska funkčnosti. Kým abstraktná trieda je špeciálnym typom triedy, ktorá funguje ako základňa pre iné triedy, rozhranie je na druhej strane iba prázdnou škrupinou s iba deklaráciami členov..