Interfejsy w C# – jak i kiedy ich używać?

PL

Wstęp

Na każdym etapie swojej kariery programista patrzy na interfejsy zupełnie inaczej. Programista rozpoczynający przygodę z programowaniem nawet jeśli zrozumie technikę działania interfejsów, to prawdopodobnie w perspektywie całej architektury aplikacji nie będzie do końca przekonany o sensie ich używania. Starszy programista z kolei dostrzeże wiele ich zalet, a wręcz konieczność ich stosowania.

Ja również mam zupełnie inne spojrzenie na interfejsy niż na początku swojej kariery, a pewnie jeszcze dużo się o nich dowiem w przyszłości.

Implementacja, a dziedziczenie. Klasa abstrakcyjna, a Interfejs.

Chyba najwięcej pytań na temat interfejsów dotyczy właśnie różnicy między implementacją, a dziedziczeniem, a mówiąc jeszcze ściślej między interfejsem właśnie, a klasą abstrakcyjną. Różnic jest kilka.

Po pierwsze, interfejs się implementuje, a po klasie abstrakcyjnej się dziedziczy.

Po drugie, klasa abstrakcyjna jako struktura obiektowa może posiadać zadeklarowane, oraz co ważne, zaimplementowane metody, podczas gdy interfejs posiada tylko zadeklarowane metody bez możliwości ich implementacji, nazywamy to kontraktem (sytuacja może zmienić się w C# 8.0, ale to jeszcze przyszłość).

Po trzecie, w przypadku pól (fields) lub propercji (properties) nie istnieje, analogicznie jak w przypadku metod, ich inicjalizacja w przypadku interfejsu, w przeciwieństwie do struktury klasy abstrakcyjnej, gdzie pola oraz propercje można inicjalizować.

To kiedy interfejs, a kiedy klasa abstrakcyjna?

  1. Z racji tego, że interfejs dostarcza wcześniej wspomniany kontrakt, który mówi jak ma wyglądać zachowanie danej klasy, a klasa abstrakcyjna zawiera metody oraz inne obiekty, które mogą być już zaimplementowane, to interfejsu używamy właśnie gdy chcemy taki kontrakt właśnie określić.

Oprócz powyższego podstawowego zastosowania interfejsu, warto wiedzieć, że interfejsy mają również inne bardziej złożone zastosowania, dotyczące również architektury aplikacji.

  1. Interfejsy stosuje się w większości implementacji takiego wzorca projektowego jak Dependency Injection, czyli wstrzykiwania zależności, wszystkich ich rodzajów, zarówno Setter Injection, czyli wstrzykiwania zależności przez propercję, Constructor Injection, czyli wstrzykiwania zależności przez konstruktor i innych.
  2. Interfejs stosuje się podczas implementacji architektury aplikacji z użyciem większości wzorców projektowych kreacyjnych oraz strukturalnych, dużo częściej przez swój charakter niż klasę abstrakcyjną.
  3. Konstrukcja struktury interfejsu wspiera taki paradygmat architektury programowania jak loose coupling, czyli luźne powiązanie. To paradygmat, który mówi o tym, aby nie uzależniać implementacji jednej klasy od drugiej, a przy realizacji ich komunikacji zachować jak największą niezależność tych modułów.

Podsumowanie

Zastosowań interfejsów jest wiele więcej, natomiast nie sposób wypisać wszystkich i także nie wszystkie jeszcze zapewne poznałem.

Zachęcam Was do korzystania z nich w jak największej liczbie implementacji, bo wpierają dobre praktyki programowania, szczególnie jeśli chodzi o Clean Code oraz DomainDriven Design, czyli DDD.

Wróć na stronę startową

ENG

English version is coming soon…

Get back to Home Page

1 komentarz do wpisu “Interfejsy w C# – jak i kiedy ich używać?

  1. Pingback: dotnetomaniak.pl

Dodaj komentarz