Ndërfaqja (programimi i orientuar nga objekti)

Në programimin e orientuar nga objekti, një ndërfaqe ose tip protokolli  është një lloj i të dhënave që vepron si një abstraksion i një klase . Ai përshkruan një grup firmash të metodës, zbatimet e të cilave mund të kryhen nga klasa të cilat nuk janë domosdoshmërisht të lidhura logjikisht me njëra-tjetrën.  Një klasë që ofron metodat e listuara në një protokoll thuhet se miraton protokollin,  ose zbaton ndërfaqen. 

Nëse objektet janë të kapsuluar plotësisht, atëherë protokolli është e vetmja mënyrë në të cilën ato mund të aksesohen nga objekte të tjera. Për shembull, në Java, ndërfaqja Comparable specifikon një metodë compareTo() të cilën duhet ta zbatojnë klasat zbatuese të kësaj ndërfaqe. Kjo do të thotë që një metodë klasifikimi, për shembull, mund të renditë një koleksion të çdo objekti të llojeve që zbatojnë ndërfaqen Comparable, pa pasur nevojë të dinë asgjë për natyrën e brendshme të klasës (përveç se dy nga këto objekte mund të krahasohen me anë të compareTo() ).

Disa gjuhë programimi ofrojnë mbështetje të qartë gjuhësore për protokollet ( Ada, C#, D, Dart, Delphi, Go, Java, Logtalk, Object Pascal, Objective-C, OCaml, PHP, Racket, Seed7, Swift, Python 3.8). Në gjuhët që mbështesin trashëgimi të shumëfishtë, si C++, ndërfaqet zbatohen si klasa abstrakte .

Në gjuhët pa mbështetje të qartë, protokollet shpesh janë ende të pranishme si konventa. Kjo njihet si shtypja e rosës . Për shembull, në Python, çdo klasë mund të zbatojë një metodë __iter__ dhe të përdoret si një koleksion . 

Klasat e tipit në gjuhë si Haskell, ose nënshkrimet e moduleve në ML dhe OCaml, përdoren për shumë nga gjërat për të cilat përdoren protokollet. 

Në Rust, ndërfaqet quhen trait. pub trait Talk{
    fn new(name: &'static str) -> Self;
    fn talk(self);
}

struct Human{ name: &'static str}

impl Talk for Human{

    fn new(name: &'static str) -> Human {
        Human { name: name}
    }

    fn talk(self){
        println!("{} is talking ! KABOOM",self.name);
    }
}

fn main(){

    let tom : Human = Talk::new("Tom");

    tom.talk();
}