"Classe abstraite" et "interface" sont des concepts similaires, l'interface étant la plus abstraite des deux. Un facteur de différenciation est que les classes abstraites fournissent des implémentations de méthodes pour les classes dérivées lorsque cela est nécessaire. En C #, toutefois, ce facteur de différenciation a été réduit par l’introduction récente de méthodes d’extension, qui permettent de fournir des implémentations pour les méthodes d’interface. Un autre facteur de différenciation est qu'une classe ne peut hériter que d'une classe abstraite (c'est-à-dire qu'il n'y a pas d'héritage multiple), mais qu'elle peut implémenter plusieurs interfaces. Cela rend les interfaces moins restrictives et plus flexibles. Donc, en C #, quand devrions-nous utiliser des classes abstraites au lieu d’interfaces avec des méthodes d’extension?
LINQ est un exemple notable de modèle de méthode interface + extension: la fonctionnalité de requête est fournie pour tout type implémenté IEnumerable
via une multitude de méthodes d'extension.