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; }
}
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
