Klasa abstrakcyjna i interfejs w języku C #

Anonim

Klasa abstrakcyjna wygląda trochę jak interfejs, ale koncepcja jest nieco myląca dla początkujących użytkowników. Koncepcyjnie, klasa abstrakcyjna wygląda jak interfejs, oczywiście, bez żadnej implementacji, jednak mają one sprawiedliwy udział w różnicach. Klasa abstrakcyjna może być częściowo lub całkowicie zaimplementowana, jednak interfejs musi zostać całkowicie zaimplementowany. Cóż, najbardziej znaczącą różnicą między nimi jest to, że klasa abstrakcyjna może mieć domyślną implementację, podczas gdy interfejs jest tylko definicją metod, które zawierają tylko deklaracje członkowskie. Omówmy szczegółowo teoretyczne aspekty obu.

Co to jest Klasa abstrakcyjna?

Klasa abstrakcyjna jest specjalnym typem klasy, który działa jako baza innych klas i nie można jej utworzyć. Logika implementacji klasy abstrakcyjnej jest dostarczana przez jej klasy pochodne. Aby utworzyć streszczenie klasy, zastosowano "abstrakcyjny" modyfikator, co oznacza, że ​​niektóre brakujące implementacje muszą zostać zaimplementowane w klasie pochodnej. Zawiera zarówno abstrakcyjnych, jak i nie abstrakcyjnych członków. Klasa abstrakcyjna ma na celu zapewnienie podstawowej funkcjonalności, którą można dodatkowo współdzielić i zastąpić wieloma klasami pochodnymi. Przydatne jest unikanie wszelkiego rodzaju powielania kodu. Wyglądają bardzo podobnie do interfejsów, ale z dodatkową funkcjonalnością.

Czym jest interfejs?

Z drugiej strony interfejs nie jest klasą zawierającą jedynie sygnaturę funkcjonalności. To wzór bez implementacji. Pojęciowo, jest to po prostu definicja metod, która zawiera tylko deklarację członków. Jest to pusta powłoka, która nie zawiera implementacji jej członków. Jest to jak abstrakcyjna klasa bazowa, która zawiera tylko abstrakcyjne elementy, takie jak metody, zdarzenia, indeksatory, właściwości itp. Nie można bezpośrednio tworzyć instancji, a jej członkowie mogą być implementowani przez dowolną klasę. Ponadto wiele klas może zostać zaimplementowanych przez klasę, jednak klasa może dziedziczyć tylko jedną klasę.

Klasa abstrakcyjna a interfejs: różnica między klasą abstrakcyjną a interfejsem w języku C #

  1. Wielokrotne dziedziczenie - Klasa może używać tylko jednej klasy abstrakcyjnej, dlatego dziedziczenie wielokrotne nie jest obsługiwane. Z drugiej strony interfejs może obsługiwać dziedziczenie wielokrotne, co oznacza, że ​​klasa może odziedziczyć dowolną liczbę dziedziczenia.
  2. Definicja z Klasa abstrakcyjna i interfejs w języku C #- Klasa abstrakcyjna to specjalny rodzaj klasy, który może zawierać definicję bez implementacji. Logika implementacji jest dostarczana przez jej klasy pochodne. Może mieć zarówno abstrakcyjne, jak i nie abstrakcyjne metody. Z drugiej strony interfejs to tylko wzór, który nie może nic zrobić. Technicznie jest to po prostu pusta skorupa.
  3. Realizacja - Klasa abstrakcyjna może zawierać zarówno definicję, jak i jej implementację. Jest to niekompletna klasa, której nie można utworzyć. Interfejs może mieć tylko podpis funkcjonalności bez żadnego kodu.
  4. Modyfikatory dostępu - Klasa abstrakcyjna może mieć kilka modyfikatorów dostępu, takich jak subs, funkcje, właściwości itd., Podczas gdy interfejs nie może mieć modyfikatorów dostępu, a wszystkie metody muszą być niejawnie zdefiniowane jako publiczne.
  5. Jednorodność - Klasa abstrakcyjna jest używana dla implementacji tego samego typu, zachowania i statusu, podczas gdy interfejs jest używany dla implementacji, które współdzielą tylko sygnatury metod.
  6. Deklaracja - Klasa abstrakcyjna działa jako klasa podstawowa dla wszystkich innych klas, więc może zadeklarować lub użyć dowolnej zmiennej, podczas gdy interfejs nie może zadeklarować żadnych zmiennych.
  7. Deklaracja konstruktora - Podczas gdy klasa abstrakcyjna może zawierać deklarację konstruktora, interfejs nie może mieć deklaracji konstruktora.
  8. Core vs. Peripheral - Klasa abstrakcyjna służy do zdefiniowania głównej tożsamości klasy i może być używana dla obiektów tego samego typu danych. Z drugiej strony interfejs służy do określania zdolności peryferyjnych klasy.
  9. Sztywny kontra Giętki - Klasa abstrakcyjna jest bardziej elastyczna pod względem funkcjonalności, przynajmniej z perspektywy programisty, podczas gdy interfejs jest bardziej sztywny.

Klasa abstrakcyjna kontra interfejs: forma tabeli

Klasa abstrakcyjna

Berło

Klasa abstrakcyjna może mieć wszystkie modyfikatory dostępu dla deklaracji składowych funkcji, podsystemów i właściwości. Interfejs nie może mieć modyfikatorów dostępu dla deklaracji składowych funkcji, podsystemów, właściwości itp. Wszyscy członkowie są domyślnie uznani za publicznie.
Klasa może co najwyżej używać tylko jednej klasy abstrakcyjnej. Klasa może dziedziczyć dowolną liczbę interfejsów.
Dziedziczenie wielokrotne nie jest obsługiwane w klasie abstrakcyjnej. Interfejs może obsługiwać dziedziczenie wielokrotne.
Z technicznego punktu widzenia jest to klasa, która może, ale nie musi, zawierać zarówno definicję, jak i jej implementację. Interfejs może mieć jedynie sygnaturę funkcji, więc jest to w zasadzie pusta powłoka.
Klasa abstrakcyjna może zawierać członków. consts, zdefiniowane metody i stubs metod. Interfejs może zawierać tylko metody i consts.
Definiuje rdzenną tożsamość klasy i jest używany do opisywania obiektów tego samego typu danych. Jest używany do opisania peryferyjnych zdolności klasy.
Członkowie klasy abstrakcyjnej nie mogą być statyczni, dopóki nie są pełnoprawnymi członkami. Członkowie interfejsu nie mogą być statyczne.
Jest idealny do implementacji tego samego rodzaju i typowego zachowania. Lepiej używać interfejsów, jeśli kilka implementacji udostępnia tylko podpisy metod.
Może mieć deklarację konstruktora. Nie może mieć deklaracji konstruktora.
Klasa abstrakcyjna ma predefiniowane pola i konstranty. Pola nie mogą być zdefiniowane w interfejsach.
Może mieć zarówno metody abstrakcyjne, jak i nie abstrakcyjne. Może mieć tylko abstrakcyjne metody.

streszczenie

Jaka jest różnica między klasą abstrakcyjną a interfejsem? Jest to prawdopodobnie jedno z najczęściej zadawanych pytań w każdym wywiadzie technicznym. Prawdopodobnie znajdziesz mnóstwo informacji o klasach abstrakcyjnych i interfejsach w każdym samouczku C #, jednak zrozumienie różnicy między nimi jest dość trudne. Możesz skonsolidować wszystkie informacje, które możesz znaleźć, a wciąż nie możesz się zdobyć. Cóż, koncepcyjnie oba są najważniejszymi terminami w programowaniu i są całkiem takie same, jednak różnią się bardzo pod względem funkcjonalności. Podczas gdy klasa abstrakcyjna jest specjalnym typem klasy, który działa jako baza dla innych klas, interfejs z drugiej strony jest po prostu pustą powłoką zawierającą tylko deklaracje członków.