Interfețe

Interfețele sunt foarte importante în programarea orientată pe obiecte, deoarece permit utilizarea polimorfismului într-un sens mai extins.

O interfață este o componentă a aplicației, asemănătoare unei clase, care declară prin membrii săi (metode, proprietăți, evenimente și indexatori) un ”comportament” unitar aplicabil mai multor clase, comportament care nu se poate defini prin ierarhia de clase a aplicației.

De exemplu, dacă vom considera arborele din figura următoare, in care AVERE este o clasă abstractă, iar derivarea claselor a fost concepută urmărind proprietățile comune ale componentelor unei averi, atunci o clasă VENIT nu este posibilă, deoarece ea ar moșteni de la toate clasele evidențiate, iar moștenirea multiplă nu este admisă în C#.

interfete

Pentru metodele din cadrul unei interfețe nu se dă nici o implementare, ci sunt pur și simplu specificate, implementarea lor fiind furnizată de unele dintre clasele aplicației. Acele clase care „aderă” la o interfață spunem că „implementează” interfața respectivă. Nu există instanțiere în cazul interfețelor, dar se admit derivări, inclusiv moșteniri multiple.

În exemplul nostru, se poate defini o interfață VENIT care să conțină antetul unei metode calc (să zicem) pentru calculul venitului obținut, fiecare dintre clasele care implementează interfața VENIT fiind obligată să furnizeze o implementare (după o formulă de calcul specifică) pentru metoda calc din interfață. Orice clasă care dorește să adere la interfață trebuie să implementeze toate metodele din interfață. Toate clasele care moștenesc dintr-o clasă care implementează o interfață moștenesc, evident, metodele respective, dar le pot și redefini (de exemplu, clasa Credit_acordat redefinește metoda calc din clasa Investiție, deoarece formula de calcul implementată acolo nu i se „potrivește” și ei. Dacă în sens polimorfic spunem că Investiție este și de tip Bani și de tip Avere, tot așa putem spune că o clasă care implementează interfața VENIT și clasele derivate din ea sunt și de tip VENIT).

De exemplu, dacă presupunem că toate clasele subliniate implementează interfața VENIT, atunci pentru o avere cu acțiuni la două firme, un imobil închiriat și o depunere la bancă, putem determina venitul total.

Actiune act1 = new Actiune();
Actiune act2 = new Actiune();
I_inchiriat casa = new I_inchiriat();
Depunere dep=new Depunere();
Venit[] venituri = new Venit()[4];
venituri[0= act1; venituri[1= act2;
venituri[2= casa; venituri[3= dep;
...
int t=0;
for(i=0;i<4;i++)
t+=v[i].calc();

Leave a comment