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.
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ść.
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 | 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. |
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.