Co to interface i jak go zaimplementować?

Interface to twór podobny do klasy z kilkoma małymi różnicami. Jeśli chcesz dowiedzieć się czym jest , jak go zaimplementować oraz poznać kilka ciekawostek na ten temat – dobrze trafiłeś. Zapraszam do lektury.

Interface zawiera jedynie specyfikację (zamiast implementacji), jego wszystkie składowe są domyślnie abstrakcyjne.

Deklarujemy go za pomocą słówka kluczowego interface, według przyjętych konwencji nazwę zaczynamy od dużej litery I np. IDisposable. Może zawierać tylko metody, własności, zdarzenia i indeksatory – wszystko z wymienionych opatrzone domyślnie modyfikatorem dostępu public.

Z uwagi na to, że interface zawiera jedynie implementację składowych abstrakcyjnych – ich implementację możemy zobaczyć dopiero w klasach implementujących dany interface.

  • Klasy mogą implementować wiele interfejsów, dziedziczyć jedynie po jednej klasie.
  • Interfejsy mogą się nawzajem implementować.

Interface to tak zwany kontrakt, który definiuje publiczne składowe abstrakcyjne będące widoczne dla użytkownika. Używanie interfaców wymusza na nas dobre wzorce programistyczne w postaci enkapsulacji klas.

Jak wygląda interfejs i jego implementacja?

Spójrz na poniższy kawałek kody, by przekonać się jak to może wyglądać w praktyce.

public interface ITest
{
    bool IsActive(int testId);
    string GetTestResult();
    object Currnet { get; }
}
 
public class Test : ITest
{
    public bool IsActive(int testId)
    {
    throw new NotImplementedException();
    }
 
    public string GetTestResult()
    {
    throw new NotImplementedException();
    }
 
    public object Currnet => throw new NotImplementedException();
}

To przypadek bardzo prosty, rzućmy zatem okiem na kilka ciekawszych implementacji.

Interfejs implementujący interfejs
public interface IFirst
{
    void FirstMethod();
}
 
public interface ISecond : IFirst
{
    void SecondMethod();
}

Jeśli utworzymy klasę implementującą ISecond, będzie ona również implementować IFirst.

public class Second : ISecond
{
    public void FirstMethod()
    {
    throw new NotImplementedException();
    }
 
    public void SecondMethod()
    {
    throw new NotImplementedException();
    }
}
Implementacja wielu interfejsów

Podczas implementowania wielu interfejsów może dojść do sytuacji kolizji składowych interfejsów. Aby rozwiązać ten problem naprzeciw naszym oczekiwaniom wychodzi jawna implementacja składowej interfejsu. Zapraszam do kolejnego przykładu:

public interface IFirst
{
    void Method();
}
 
public interface ISecond
{
    int Method();
}
 
public class TestClass : IFirst, ISecond
{
    public void Method()
    {
        Console.WriteLine("To metoda z interfejsu IFirst");
    }
 
    int ISecond.Method();
    {
        Console.WriteLine("To metoda z interfejsu ISecond");
        return 1;
    }
}

Metody Method mogą istnieć w klasie TestClass tylko dlatego, że tą wywodzącą się z interfejsu ISecond zdefiniowaliśmy w sposób jawny. Jak wygląda wywołanie tak zdefiniowanych metod?

TestClass testClass = new TestClass();
testClass.Method();               //To metoda z interfejsu IFirst
((IFirst)testClass).Method();     //To metoda z interfejsu IFirst
((ISecond)testClass).Method();    //To metoda z interfejsu ISecond

Sposobem wywołania jawnie zaimplementowanych składowych interfejsów jest ich rzutowanie na typ interfejsu. W praktyce powodem jawnej implementacji interfejsów może być chęć ukrycia specjalistycznych składowych, które w codzinnym użytkowaniu przeszkadzałyby z korzystaniu z klasy.

W tym miejscu następuje koniec treści merytorycznej, a ja…

mam nadzieję, że ten krótki wpis był dla Ciebie wartościowy i czas który poświęciłeś na jego czytanie uznasz za dobrze spożytkowany.

 

Jeśli poszukujesz większej ilości ciekawych treści na pewno zainteresują Cię inne wpisy, które umieściłem na blogu. Zapraszam do pozostawienia komentarzy, czekam na Twoją opinię, uwagi i feedback.

Pozdrawiam Cię serdecznie i życzę fantastycznego dnia!
Wojtek