Interfejsy w C#

Od kiedy powróciłem na swoją programistyczną ścieżkę zawsze miałem problem ze zrozumieniem po co te interfejsy… Przecież kiedy chcemy, aby dane metody były przekazane do pozostałych klas można stworzyć klasę bazową (ba nawet abstrakcyjną) i skorzystać z dziedziczenia. Okazuję się jednak że nie zawsze jest to wygodne rozwiązanie, bo skoro mamy własnie te interfejsy to czemu z nich nie korzystać, zamiast tworzyć dodatkowe klasy w dodatku w uporządkowanej hierarchii dziedziczenia. Ponadto interfejs ma bardzo ważna przewagę nad klasą bazową, ponieważ klasa może dziedziczyć tylko po jednej klasie, natomiast do klasy możemy za implementować wiele interfejsów. Ten post ma za zadanie przypomnieć zasady używania interfejsów w C#.

1. Deklaracja, oraz co może a czego nie może zawierać interfejs

a) Przykładowa deklaracja interfejsu:

interface IFigury
    {
        double Obwod
        {
            get;
        }
        double Pole();
    }

b) Co możną, a czego nie można w interfejsie:

 

  • w interfejsie nie można definiować pól także pól statycznych
  • wszystkie właściwości oraz metody są domyślnie publiczne, także sam interfejs
  • metody i właściwości zawierają tylko ogólna deklarację bez kodu
  • interfejs może dziedziczyć po innym interfejsie, ale nie po klasie
  • jak było napisane wyżej do klasy można implementować wiele interfejsów
  • dobrym zwyczajem w .Net jest nazywać interfejsy od dużej litery “I”

 

2. W jaki sposób implementować interfejs, oraz różnica między Explicite a Implicit

a) Implementacja

Aby poprawnie za implementować interfejs musimy zachować następujące warunki:

 

  • metody i właściwości muszą mieć takie same nazwy, typy zwracane oraz
  • metody i właściwości muszą być publiczne

 

class Kwadrat : IFigury
    {
        public int bok_a;
        public Kwadrat(int a)
        {
            bok_a = a;
        }

        public double Pole()
        {
            return bok_a * bok_a;
        }
        public double Obwod
        {
            get
            {
                return 4 * bok_a;
            }
        }
    }

b) Explicite a Implicit
Interfejsy możemy implementować dwojako. W załączonym wyżej kodzie, interfejs został zaimplementowany w sposób Implicit,

Interfejs zaimplementowany w sposób Explicite

class Kwadrat : IFigury
    {
        public int bok_a;
        public Kwadrat(int a)
        {
            bok_a = a;
        }

        double IFigury.Obwod
        {
            return 4 * bok_a;
        }

        double IFigury.Pole()
        {
            return bok_a * bok_a;
        }
    }

Różnica polega na podaniu nazwy interfejsu i po kropce nazwy metody, do czego jest nam przydatna implementacja w sposób Explicit, najczęściej stosuję się gdy istnieje konflikt nazw metod, w przypadku gdy inne interfejsy posiadają metody o takich samych nazwach.

3. Odnoszenie się do obiektów klas poprzez interfejs.

Obiekty klas które implementują dany interfejs można referować do obiektów utworzonych przez interfejs. Obiekty takie zachowują wówczas tylko metody i właściwości które posiada dany interfejs.

interfejs_rzutowanie

Jak widać obiekt iFunkcjeZyciowe, posiada tylko metody interfejsu.