"Classe astratta" e "interfaccia" sono concetti simili, con l'interfaccia che è la più astratta delle due. Un fattore di differenziazione è che le classi astratte forniscono implementazioni di metodi per le classi derivate quando necessario. In C #, tuttavia, questo fattore di differenziazione è stato ridotto dalla recente introduzione di metodi di estensione, che consentono di fornire implementazioni per i metodi di interfaccia. Un altro fattore di differenziazione è che una classe può ereditare solo una classe astratta (cioè non c'è ereditarietà multipla), ma può implementare più interfacce. Ciò rende le interfacce meno restrittive e più flessibili. Quindi, in C #, quando dovremmo usare le classi astratte anziché le interfacce con i metodi di estensione?
Un esempio notevole del modello del metodo di interfaccia + estensione è LINQ, in cui viene fornita la funzionalità di query per qualsiasi tipo implementato IEnumerable
tramite una moltitudine di metodi di estensione.