Interfejsy
Interfejsy w języku C# pozwalają na tworzenie abstrakcyjnych kontraktów, które określają, jakie metody, właściwości i zdarzenia musi zaimplementować klasa lub struktura. Interfejs jest typem referencyjnym i nie można tworzyć obiektów na podstawie interfejsu. Zamiast tego, klasy lub struktury muszą zaimplementować interfejs, aby móc go używać. Interfejsy służą głównie do polimorfizmu i dziedziczenia wielokrotnego.
Interfejsy w języku C# deklaruje się za pomocą słowa kluczowego interface
po czym następuje nazwa interfejsu.
public interface NazwaInterfejsu
{
void WyswieltWiek();
double PoliczRachunek();
}
Interfejsy mogą dziedziczyć po innych interfejsach, używając słowa kluczowego ":".
class Osoba : Kobieta
{
public string Imie { get; set; }
}
Interfejsy mogą zawierać metody, właściwości i zdarzenia, ale nie mogą zawierać pola i implementacji metod. Wszystkie elementy interfejsu są publiczne i nie mogą być oznaczone jako prywatne lub chronione.
using System;
class Program
{
static void Main(string[] args)
{
Document document = new Document();
document.Content = "Treść dokumentu";
// użycie interfejsu IPrintable
IPrintable printable = document;
printable.Print();
// użycie interfejsu ISaveable
ISaveable saveable = document;
saveable.Save();
}
interface IPrintable
{
void Print();
}
interface ISaveable
{
void Save();
}
class Document : IPrintable, ISaveable
{
public string Content { get; set; }
public void Print()
{
Console.WriteLine(Content);
}
public void Save()
{
// implementacja zapisywania do pliku
}
}
}
Treść dokumentu
W powyższym przykładzie stworzyliśmy interfejsy IPrintable i ISaveable, które zawierają metody Print() i Save() odpowiednio. Następnie stworzyliśmy klasę Document, która implementuje te interfejsy i zawiera implementację tych metod. W metodzie Main() tworzymy obiekt klasy Document i przypisujemy go do zmiennych typu IPrintable i ISaveable. Dzięki temu możemy używać tych zmiennych do wywoływania metod Print() i Save() na obiekcie klasy Document.
interfejsy pozwalają na abstrakcyjne określenie zestawu metod, które muszą być zaimplementowane przez klasy, które chcą implementować dany interfejs. Jest to przydatne w przypadku, gdy chcemy używać różnych klas, które implementują dany interfejs, w sposób niezależny od ich konkretnej implementacji.