W tej lekcji zapoznamy się z interfejsami. Interfejs informuje klasę która go implementuje, jakie ma zawierać, metody, własności, indeksery ale nie mówi jak mają one wykonywać operacje. Przejdziemy może trochę do teorii i zacznijmy od ogólnej deklaracji interfejsu:
interface nazwa_interfejsu
{
…
}
Składnikami interfejsu są na przykład metody, ale bez dokładniej implementacji, oraz specyfikatora dostępu, oto przykład takiego interfejsu o nazwie figury, będzie on zawierał metodę Pole, wtedy każda klasa która implementuje (warto pamiętać o takim niuansie, że interfejs się implementuje w klasie, a nie klasa go dziedziczy, bo jak zaraz się przekonasz zapis jest bardzo podobny do dziedziczenia.)interfejs będzie musiała zawierać metodę Pole(), a więc oto ten interfejs:
interface Figury
{
double Pole();
}
Teraz zanim jeszcze zaimplementujemy interfejs dodajmy do niego jeszcze jeden składnik, niech to będzie własność. Przy dodawaniu własności lub indeksu do interfejsu, piszemy tylko akcesory jakie ma zawierać np. własność (get lub set)ale nie piszemy jakie mają one przeprowadzać operacje. A więc dla przykładu dodajmy własność tylko do odczytu (czyli z akcesorem get) o nazwie obwod która to będzie nam zwracać jaki obwód ma dana figura, jak wiemy w różnych figurach różnie liczy się obwód:
interface Figury
{
double Obwod
{
get;
}
double Pole();
}
A więc teraz pozostaje nam zaimplementować nasz interfejs w naszych klasach o figurach, następnie potem za pomocą referencji do interfejsu wywołamy nas interesujące metody i własności. Interfejs implementujemy w następujący sposób:
nazwa_klasy : nazwa_interfejsu
{
…
}
Czyli zapis bardzo podobny jak podczas dziedziczenia, a oto nasz program wykorzystujący interfejs:
Początek kodu:
using System;
interface Figury
{
double Obwod
{
get;
}
double Pole();
}
class Kwadrat : Figury
{
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;
}
}
}
class Trojkat : Figury
{
public int bok_a, bok_b, bok_c;
public int h;
public Trojkat(int a, int b, int c, int wysokosc)
{
bok_a = a;
bok_b = b;
bok_c = c;
h = wysokosc;
}
public double Pole() {
return 0.5 * bok_a * h;
}
public double Obwod
{
get
{
return bok_a + bok_b + bok_c;
}
}
}
class Pokaz
{
public static void Main()
{
Kwadrat kw = new Kwadrat(5);
Trojkat troj = new Trojkat(10, 5, 7, 8);
Figury wybrany;
string wybor;
Console.Write(„1- KWADRAT\n2- TRÓJKĄT\nWyboór: „);
wybor = Console.ReadLine();
switch (wybor)
{
case „1″:
wybrany = kw;
break;
case „2″:
wybrany = troj;
break;
default:
return;
break;
}
Console.WriteLine(„\n\nPole: ” + wybrany.Pole() + „ obwód: ” + wybrany.Obwod);
}
}
Koniec kodu:
W naszym programie tworzymy dwie klasy które implementują interfejs Figury, jeżeli którakolwiek by z klas nie miała któregoś ze składników interfejsu został by zgłoszony błąd. W naszym programie w dynamiczny sposób przypisujemy do obiektu referencję, jest to ważne bo uzyskanie takiego efektu nie za pomocą referencji do interfejsu jest żmudne i nie wydajne, a niekiedy nie możliwe. Warto wspomnieć jak wygląd indekser w interfejsie, oto mały przykład:
int this[int indeks]
{
get ;
set ;
}
To tyle w tej lekcji.