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.
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í.
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 | 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. |
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ů..