Showing posts with label interfejs. Show all posts
Showing posts with label interfejs. Show all posts

Saturday, February 13, 2016

Interfejsi u C# programskom jeziku



Kao što vam je poznato, klasa ne može da nasleđuje istovremeno više osnovnih klasa. Ali zato može da implementira više interfejsa, istovremeno. Dok osnovna klasa definiše šta ona u stvari predstavlja, interfejs definiše šta klasa radi. Interfejs uopšte ni ne zna šta klasa predstavlja, nije uopšte zavisna od toga ali se interfejsi opet mogu dodati klasi i koristiti u mnogim situacijama. Interfejs je najjednostavnije rečeno ugovor koji kompletno odvaja imena i potpise metoda, propertija, indeksera, delegata i događaja od njihove implementacije. Ali interfejs ne može da sadrži polja. Na taj način osiguravate da klasa koja je u interakciji kroz određeni interfejs nema pristup internim podacima objekta. Interfejsi jesu slični apstraktnim klasama, samo što ne mogu da sadrže ništa osim navedenih potpisa i nije retkost da se interfejsi koriste zajedno sa apstraktnim klasama da bi se gradila programerska radna okruženja koja se proširuju. Interfejs, kao i apstraktna klasa se ne može instancirati. Implementacija interfejsa se u potpunosti prepušta implementirajućoj klasi. Svaki član interfejsa za razliku od klasa se podrazumeva da je javni, svaki član mora biti javni i svaki član se mora implementirati u istoj implementirajućoj klasi. Ali najvažnija osobina interfejsa je da klase mogu implementirati više interfejsa kao i što interfejs može da poziva druge interfejse. Kada se iz jednog interfejsa pozivaju drugi interfejsi, onda se to naziva re-implementation.





( Interfejsi i apstraktne klase zahtevaju implementaciju )


Programerima kojima je poznat koncept COM interfejsa, treba da znaju da postoji razlika. U C# programskom jeziku interfejsi se ne izvode iz klase IUnknown. Oni predstavljaju ugovor izražen u vidu funkcija radnog okvira .Net Framework-a i za razliku od COM interfejsa, interfejsi u C# ne predstavljaju nikakvu vrstu binarnog standarda. Interfejsi se definišu sa ključnom rečju interface i u nazivu interfejsa je uvek poželjno staviti prefiks ’I’ kako bi se znalo da je reč o interfejsu. To je jednostavno nepisano pravilo i praksa.

interface IBankAccount
{
    void Withdraw(decimal amount);
    void PayIn(decimal amount);
    decimal Balance { get; }

}

Navedeni interfejs sadrži dve metode i jedan properti koji je ograničen samo na čitanje. Obe metode i properti se moraju implementirati u klasi koja poziva interfejs. Interfejs se može implementirati implicitno ili eksplicitno. Eksplicitna implementacija se uglavnom primenjivala u situacijama kad ste sigurni da neki drugi interfejs može sadržavati isti naziv metode kao u ovakvom slučaju:

public interface IEmployee
{
    void DisplayEmployee();

}

public interface ICompany
{
    void DisplayEmployee();

}

Onda bi ste metode jedino mogli da razlikujete i pozivate kastingom:

Program program = new Program();
((IEmployee)program).DisplayEmployee();
((ICompany)program).DisplayEmployee();

Zato je eksplicitno povezivanje bolje, dok implicitno se sve ređe koristi čak ga i ne preporučuju. Često se dešava da programeri mešaju ova dva načina implementacije i kad govore o implicitnoj implementaciji u stvari misle na eksplicitnu i obratno. Zato dobro pogledajte oba primera implementacije interfejsa. U velikim projektima interfejsi itekako imaju veliku vrednost i primenu i često će te se susretati sa obe implementacije.

Implicitno implementiranje interfejsa