Interfejsy w C

1. Wprowadzenie

  • Interfejs to kontrakt, który definiuje zestaw metod, właściwości, zdarzeń lub indeksatorów bez implementacji.
  • Klasy implementujące interfejs muszą dostarczyć implementację wszystkich jego członków.
  • Interfejsy umożliwiają:
    • Polimorfizm – różne klasy mogą być traktowane jako ten sam typ,
    • Rozdzielenie definicji od implementacji,
    • Wielokrotne dziedziczenie – klasa może implementować wiele interfejsów.
  • Nazwy interfejsów w C# zazwyczaj zaczynają się od I (np. IComparable, IEnumerable).

2. Definicja interfejsu

Składnia:

Przykład:


3. Implementacja interfejsu

  • Klasa implementuje interfejs za pomocą operatora :.
  • Musi dostarczyć implementację wszystkich członków interfejsu.

4. Używanie interfejsów

  • Obiekty różnych klas mogą być traktowane jako ten sam typ interfejsu.

5. Wielokrotne implementowanie interfejsów

  • Klasa może implementować wiele interfejsów jednocześnie.
  • W C# nie ma dziedziczenia wielokrotnego, ale można implementować wiele interfejsów.

6. Interfejsy a klasy abstrakcyjne

Cecha Interfejs Klasa abstrakcyjna
Implementacja metod Brak (do C# 8) lub domyślna (C# 8+) Może zawierać metody z implementacją
Dziedziczenie wielokrotne Klasa może implementować wiele Klasa może dziedziczyć tylko jedną
Pola Nie może zawierać pól Może zawierać pola
Modyfikatory dostępu Wszystkie członki są publiczne Może mieć różne modyfikatory
Konstruktory Nie posiada Może posiadać konstruktory
Zastosowanie Definiowanie kontraktu Baza dla powiązanych klas

7. Właściwości w interfejsach


8. Implementacja jawna interfejsu

  • Implementacja jawna pozwala na implementację metod o tej samej nazwie z różnych interfejsów.
  • Metody zaimplementowane jawnie są dostępne tylko przez referencję interfejsu.

9. Dziedziczenie interfejsów

  • Interfejsy mogą dziedziczyć z innych interfejsów.

10. Domyślne implementacje w interfejsach (C# 8.0+)

  • Od C# 8.0 interfejsy mogą zawierać domyślne implementacje metod.
  • Klasy mogą, ale nie muszą, przesłaniać tych metod.

11. Interfejsy wbudowane w .NET

11.1. IEnumerable i IEnumerable<T>

  • Umożliwiają iterację po kolekcji za pomocą foreach.

11.2. IComparable i IComparable<T>

  • Pozwalają na porównywanie i sortowanie obiektów.

11.3. IDisposable

  • Używany do zwalniania zasobów niezarządzanych.

12. Polimorfizm z interfejsami


13. Przykładowy program

Wynik:

Metoda płatności: Karta kredytowa
Płacę 100,50 zł kartą 1234-5678-9012-3456
Metoda płatności: PayPal
Płacę 250,00 zł przez PayPal (user@example.com)

14. Najlepsze praktyki

  • Nazywaj interfejsy z prefiksem I (np. IZwierze, ILogger).
  • Stosuj interfejsy do definiowania kontraktów między komponentami.
  • Preferuj interfejsy nad klasami abstrakcyjnymi, gdy nie potrzebujesz implementacji.
  • Używaj małych, skoncentrowanych interfejsów (Interface Segregation Principle).
  • Interfejsy ułatwiają testowanie – można łatwo tworzyć mocki.
  • Nie dodawaj zbyt wielu metod do jednego interfejsu – lepiej podzielić na mniejsze.

15. Podsumowanie

  • Interfejs to kontrakt definiujący metody bez implementacji.
  • Klasa może implementować wiele interfejsów.
  • Interfejsy wspierają polimorfizm i rozdzielenie definicji od implementacji.
  • Od C# 8.0 interfejsy mogą mieć domyślne implementacje.
  • Interfejsy są podstawą wielu wzorców projektowych i technik programowania.