Cześć! Dzisiaj chciałbym Ci opowiedzieć o interfejsach w C#. Jest to jeden z kluczowych elementów języka, który pozwala nie tylko na pisanie bardziej elastycznego i czystego kodu, ale też ułatwia testowanie i rozszerzanie aplikacji. Bez interfejsów trudno wyobrazić sobie projekty działające w oparciu o wzorce projektowe i zasady SOLID.
Czym są interfejsy w C#?
W dużym skrócie, interfejs definiuje zbiór metod, właściwości i zdarzeń, które klasa lub struktura musi zaimplementować, jeśli deklaruje, że ten interfejs "obsługuje". Interfejs to taki "szablon" zachowania bez konkretnej implementacji.
Dlaczego warto używać interfejsów?
• Zapewniają polimorfizm: różne klasy mogą implementować ten sam interfejs, a my możemy pracować z nimi w ujednolicony sposób.
• Ułatwiają testowanie: w testach można w łatwy sposób podmieniać klasy na implementacje "mocków".
• Wspomagają zasadę odwrócenia zależności (Dependency Inversion): zamiast polegać na konkretnej klasie, polegamy na interfejsie.
Prosty przykład interfejsu
Wyobraź sobie, że tworzymy aplikację, w której różne zwierzęta mogą wydawać odgłosy. Zdefiniujmy interfejs:
public interface IAnimal
{
void MakeSound();
}
• IAnimal deklaruje jedną metodę MakeSound().
• Każda klasa, która chce być traktowana jako "zwierzę", musi zaimplementować tę metodę.
Implementacja interfejsu
Teraz utwórzmy dwie klasy: Dog i Cat, które zaimplementują IAnimal.
public class Dog : IAnimal
{
public void MakeSound()
{
Console.WriteLine("Hau Hau!");
}
}
public class Cat : IAnimal
{
public void MakeSound()
{
Console.WriteLine("Miau Miau!");
}
}
W kodzie aplikacji możemy użyć takich obiektów w następujący sposób:
public class Program
{
public static void Main()
{
IAnimal dog = new Dog();
IAnimal cat = new Cat();
dog.MakeSound(); // Hau Hau!
cat.MakeSound(); // Miau Miau!
}
}
Tutaj odwołujemy się do klasy przez interfejs IAnimal. Dzięki temu możemy traktować obiekty Dog i Cat jednakowo w kontekście wywoływania metody MakeSound().
Interfejsy w praktyce: polimorfizm i testowanie
1. Polimorfizm w akcji
• Możesz stworzyć kolekcję typu List<IAnimal> i wrzucać tam obiekty różnych klas. Poniżej przykład:
var animals = new List<IAnimal>
{
new Dog(),
new Cat()
};
foreach (var animal in animals)
{
animal.MakeSound();
}
W pętli nie interesuje Cię, które konkretnie zwierzę dajesz do kolekcji – wystarczy, że każde ma zaimplementowaną metodę MakeSound().
2. Testowanie z użyciem interfejsów
• Dzięki temu, że w kodzie odwołujesz się do IAnimal zamiast bezpośrednio do Dog czy Cat, możesz w testach podmienić rzeczywistą implementację na np. obiekt mocka (np. z biblioteki Moq).
• To umożliwia pisanie testów jednostkowych bez faktycznego uruchamiania logiki konkretnej klasy.
Właściwości i zdarzenia w interfejsach
Interfejs nie musi zawierać tylko metod. Możemy zadeklarować również właściwości czy zdarzenia, które klasa implementująca interfejs musi zdefiniować.
public interface IVehicle
{
string Model { get; set; }
event Action OnStart;
void Drive();
}
Implementacja mogłaby wyglądać tak:
public class Car : IVehicle
{
public string Model { get; set; }
public event Action OnStart;
public Car(string model)
{
Model = model;
}
public void Drive()
{
OnStart?.Invoke();
Console.WriteLine($"{Model} is driving...");
}
}
Tu klasa Car musi mieć publiczną właściwość Model (z get/set) oraz zdarzenie OnStart. Gdy wywołamy Drive(), odpalone zostanie zdarzenie (jeśli ktoś się na nie zapisał).
Nowości: domyślne implementacje w interfejsach (C# 8+)
Od wersji C# 8 w interfejsach można definiować domyślne implementacje metod. Jest to przydatne np. do rozbudowy interfejsu o dodatkowe metody bez łamania istniejącego kodu.
public interface IAdvancedAnimal
{
void MakeSound();
// Domyślna implementacja
void Move()
{
Console.WriteLine("I am moving.");
}
}
Klasy implementujące ten interfejs nie muszą przesłaniać metody Move(), jeśli wystarcza im ta domyślna. Jeśli jednak chcą zmienić zachowanie, mogą ją nadpisać jak w zwykłej klasie.
Podsumowanie
Interfejsy to jeden z fundamentów OOP w C#. Pozwalają uniezależnić się od konkretnych implementacji, ułatwiają testowanie i wspierają zasady SOLID. Warto więc nauczyć się z nich korzystać od samego początku przygody z platformą .NET.
Jeżeli chcesz pogłębić swoją wiedzę i nauczyć się nie tylko teoretycznych, ale też praktycznych aspektów tworzenia aplikacji w C#, serdecznie zapraszam Cię do mojego szkolenia online "Zostań Programistą .NET". Znajdziesz tam kompleksowy materiał – od podstaw języka, przez wzorce projektowe, po zaawansowane zagadnienia związane z tworzeniem profesjonalnych aplikacji.
Daj znać w komentarzu, czy korzystasz z interfejsów w swoich projektach i co sprawia Ci największą trudność.
To wszystkie na dzisiaj. Jeżeli taki artykuł Ci się spodobał, to koniecznie dołącz do mojej społeczności – darmowe zapisy, gdzie będziesz również miał dostęp do dodatkowych materiałów i przede wszystkim bonusów. Do zobaczenia w kolejnym artykule.