"Classe astratta" e "interfaccia" sono concetti simili, con l'interfaccia che è il più astratto dei due. Un fattore di differenziazione è che le classi astratte forniscono implementazioni del metodo 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 (vale a dire, non esiste un'eredità multipla), ma può implementare più interfacce. Ciò rende le interfacce meno restrittive e più flessibili. Quindi, in C #, quando dovremmo utilizzare le classi astratte anziché le interfacce con i metodi di estensione?
Un esempio notevole del modello di metodo dell'interfaccia + estensione è LINQ, in cui viene fornita la funzionalità di query per qualsiasi tipo che implementa IEnumerable
tramite una moltitudine di metodi di estensione.