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#.
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();