Różnica między klasą abstrakcyjną a interfejsem w języku C #

Klasa abstrakcyjna przypomina interfejs, ale dla początkujących użytkowników OOP koncepcja jest nieco myląca. Pod względem koncepcyjnym klasa abstrakcyjna wygląda oczywiście jak interfejs, oczywiście bez żadnej implementacji, jednak mają spory udział w różnicach. Chociaż klasa abstrakcyjna może być częściowo lub całkowicie zaimplementowana, interfejs musi być zaimplementowany całkowicie. Cóż, najbardziej zauważalną różnicą między nimi jest to, że klasa abstrakcyjna może mieć domyślną implementację, podczas gdy interfejs to tylko definicja metod, która zawiera tylko deklaracje składowe. Omówmy szczegółowo teoretyczne aspekty obu.

Co to jest klasa abstrakcyjna?

Klasa abstrakcyjna to specjalny typ klasy, który działa jako baza innych klas i nie może być utworzony. Logikę implementacji klasy abstrakcyjnej zapewniają jej klasy pochodne. Aby uczynić klasę abstrakcyjną, stosuje się modyfikator „abstrakcyjny”, co oznacza, że ​​w klasie pochodnej należy zaimplementować brakującą implementację. Zawiera zarówno członków abstrakcyjnych, jak i nieabstrakcyjnych. Klasa abstrakcyjna ma na celu zapewnienie podstawowej funkcjonalności, którą można dalej udostępniać i zastępować wieloma klasami pochodnymi. Przydatne jest unikanie wszelkiego rodzaju powielania kodu. Wyglądają bardzo podobnie do interfejsów, ale mają dodatkową funkcjonalność.

Co to jest interfejs?

Z drugiej strony interfejs nie jest klasą, która zawiera jedynie sygnaturę funkcjonalności. Jest to wzorzec bez implementacji. Mówiąc koncepcyjnie, jest to tylko definicja metod, która zawiera tylko deklarację członków. To pusta powłoka, która nie zawiera implementacji swoich członków. To jest jak abstrakcyjna klasa podstawowa, która zawiera tylko elementy abstrakcyjne, takie jak metody, zdarzenia, indeksatory, właściwości itp. Nie można bezpośrednio tworzyć jej instancji, a jej elementy mogą być implementowane przez dowolną klasę. Dodatkowo klasa może implementować wiele interfejsów, jednak klasa może dziedziczyć tylko jedną klasę.

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

  1. Wielokrotne dziedziczenie - Klasa może używać tylko jednej klasy abstrakcyjnej, dlatego wielokrotne dziedziczenie nie jest obsługiwane. Z drugiej strony interfejs może obsługiwać wielokrotne dziedziczenie, co oznacza, że ​​klasa może dziedziczyć dowolną liczbę spadków.
  2. Definicja  z Klasa abstrakcyjna i interfejs w języku C #- Klasa abstrakcyjna to specjalny typ klasy, który może zawierać definicję bez implementacji. Logikę implementacji zapewniają klasy pochodne. Może mieć zarówno abstrakcyjne, jak i nieabstrakcyjne metody. Z drugiej strony interfejs jest tylko wzorem, który nic nie może zrobić. Technicznie jest to 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ć podpis funkcji tylko bez kodu.
  4.  Modyfikatory dostępu - Klasa abstrakcyjna może mieć kilka modyfikatorów dostępu, takich jak napisy, funkcje, właściwości itp., Podczas gdy interfejs nie może mieć modyfikatorów dostępu, a wszystkie metody muszą być domyślnie zdefiniowane jako publiczne.
  5. Jednorodność - Klasa abstrakcyjna jest używana do implementacji tego samego typu, zachowania i statusu, podczas gdy interfejs jest używany do implementacji, które współużytkują tylko sygnatury metod.
  6. Deklaracja - Klasa abstrakcyjna działa jako klasa podstawowa dla wszystkich innych klas, dzięki czemu może deklarować lub używać dowolnej zmiennej, podczas gdy interfejs nie może deklarować żadnych zmiennych.
  7. Deklaracja Konstruktora - Chociaż klasa abstrakcyjna może mieć deklarację konstruktora, interfejs nie może mieć deklaracji konstruktora.
  8. Rdzeń kontra urządzenia peryferyjne - Klasa abstrakcyjna służy do definiowania podstawowej tożsamości klasy i może być używana do obiektów tego samego typu danych. Z drugiej strony interfejs służy do definiowania zdolności peryferyjnej klasy.
  9. Sztywny kontra giętki - Klasa abstrakcyjna jest bardziej elastyczna pod względem funkcjonalności, przynajmniej z perspektywy dewelopera, podczas gdy interfejs jest bardziej sztywny.

Klasa abstrakcyjna a interfejs: forma tabeli

Klasa abstrakcyjna

Berło

Klasa abstrakcyjna może mieć wszystkie modyfikatory dostępu do deklaracji składowych funkcji, podrzędnych i właściwości. Interfejs nie może mieć modyfikatorów dostępu do deklaracji funkcji, elementów podrzędnych, właściwości itp. Wszystkie elementy są domyślnie jawne.
Klasa może co najwyżej wykorzystywać tylko jedną klasę abstrakcyjną. Klasa może dziedziczyć dowolną liczbę interfejsów.
Wielokrotne dziedziczenie nie jest obsługiwane w klasie abstrakcyjnej. Interfejs może obsługiwać wielokrotne dziedziczenie.
Technicznie jest to klasa, która może zawierać definicję i jej implementację. Interfejs może mieć tylko sygnaturę funkcjonalności, więc jest w zasadzie pustą powłoką.
Klasa abstrakcyjna może zawierać członków. consts, zdefiniowane metody i kody pośredniczące metod. Interfejs może zawierać tylko metody i stałe.
Definiuje podstawową tożsamość klasy i służy do opisywania obiektów tego samego typu danych. Służy do opisu peryferyjnych zdolności klasy.
Członkowie klasy abstrakcyjnej nie mogą być statyczni, chyba że jest to członek kompletny. Członkowie interfejsu nie mogą być statyczni.
Jest idealny do realizacji tego samego rodzaju i wspólnego zachowania. Lepiej jest używać interfejsów, jeśli kilka implementacji korzysta tylko z sygnatur metod.
Może mieć deklarację konstruktora. Nie może mieć deklaracji konstruktora.
Klasa abstrakcyjna ma wstępnie zdefiniowane pola i stałe. Pola nie mogą być zdefiniowane w interfejsach.
Może mieć zarówno abstrakcyjne, jak i nieabstrakcyjne metody. 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 na temat klas abstrakcyjnych i interfejsów w dowolnym tutorialu C #, jednak zrozumienie różnicy między nimi jest dość trudną częścią. Możesz skonsolidować wszystkie informacje, które możesz znaleźć, a wciąż nie możesz uzyskać ich dość. 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 rodzajem klasy, która działa jako baza dla innych klas, interfejs z drugiej strony jest po prostu pustą powłoką z tylko deklaracjami składowymi.