Liittymät (interface) kuvailevat luokkien tai tietueiden toiminnallisuuden eli määrittelevät mitä metodeita, ominaisuuksia, indeksereitä ja tapahtumia niillä tulee olla. Liittymät eivät tarjoa toteutusta mainituille jäsenille vaan se jää luokan tai tietueen tehtäväksi. Liittymät määritellään interface-avainsanalla.
interface IVirheenTallentaja
{
	void TallennaVirheenTiedot(string viesti);
}
Liittymän toteuttaminen tapahtuu kuten periytyminen
public class EmailVirheenTallentaja : IVirheenTallentaja
{
	// toteuttaa liittymän metodin
	public void TallennaVirheenTiedot(string viesti)
	{
		// lähetä virhe sähköpostiin
	}
}
Jos luokka periytyy toisesta luokasta ja toteuttaa liittymän, tulee ensin merkitä perittävä luokka ja sen perään toteutettavat liittymät
// luokka, joka periytyy luokasta OmaLuokka ja toteuttaa liittymat ILiittyma1 ja ILiittyma2
public class JokuLuokka : OmaLuokka, ILiittyma1, ILiittyma2
{
}

Liittymän ja abstraktin luokan eroja

Abstraktit luokat ja jäsenet (abstrakteine jäsenineen) voi myös pakottaa luokalla olemaan tiettyjä jäseniä. Liittymillä ja abstrakteilla luokilla on kuitenkin joitain eroavaisuuksia, joita vertaillen pitäisi löytää niistä sopivampi vaihtoehto.
Liittymä Abstrakti luokka
Periytyminen Luokka voi toteuttaa useita liittymiä Luokka voi periytyä (suoraan) vain yhdestä luokasta
Suojausmääreet Kaikki liittymän jäsenet ovat julkisia (public) Jäsenille voi antaa suojausmääreet
Jäsenien toteutus Jäsenille ei voi antaa toteutusta Jäsenille voi antaa toteutuksen ja periytyvä luokka voi ylikirjoittaa sen tarvittaessa
Jäsenien lisääminen Lisätyt jäsenet pitää lisätä jokaiseen toteuttavaan luokkaan Jäsenelle voi tehdä oletustoteutuksen, jolloin periviä luokkia ei tarvitse muokata
Kentät ja vakiot Ei voi määritellä Voi määritellä