"Abstrakte Klasse" und "Schnittstelle" sind ähnliche Konzepte, wobei die Schnittstelle die abstraktere der beiden ist. Ein entscheidender Faktor ist, dass abstrakte Klassen bei Bedarf Methodenimplementierungen für abgeleitete Klassen bereitstellen. In C # wurde dieser Differenzierungsfaktor jedoch durch die kürzliche Einführung von Erweiterungsmethoden reduziert, die es ermöglichen, Implementierungen für Schnittstellenmethoden bereitzustellen. Ein weiterer Unterscheidungsfaktor ist, dass eine Klasse nur eine abstrakte Klasse erben kann (dh es gibt keine Mehrfachvererbung), aber sie kann mehrere Schnittstellen implementieren. Dies macht Schnittstellen weniger restriktiv und flexibler. Wann sollten wir in C # abstrakte Klassen anstelle von Schnittstellen mit Erweiterungsmethoden verwenden?
Ein bemerkenswertes Beispiel für das Modell der Schnittstelle + Erweiterungsmethode ist LINQ, bei dem die Abfragefunktion für jeden Typ bereitgestellt wird, der IEnumerable
über eine Vielzahl von Erweiterungsmethoden implementiert wird .