web-dev-qa-db-ger.com

Schnittstellen vs. abstrakte Klassen

Wann sollten Sie in C # Schnittstellen und wann abstrakte Klassen verwenden? Was kann der entscheidende Faktor sein?

118
tush1r

Die Vorteile einer abstrakten Klasse sind:

  • Möglichkeit, Standardimplementierungen von Methoden anzugeben
  • Invariante Prüfung zu Funktionen hinzugefügt
  • Haben Sie etwas mehr Kontrolle darüber, wie die "Interface" -Methoden aufgerufen werden
  • Fähigkeit, Verhalten im Zusammenhang mit oder ohne Bezug zur Schnittstelle für "frei" bereitzustellen

Schnittstellen sind lediglich Datenübermittlungsverträge und weisen diese Merkmale nicht auf. Sie sind jedoch in der Regel flexibler, da ein Typ nur von einer Klasse abgeleitet werden kann, aber eine beliebige Anzahl von Schnittstellen implementieren kann.

132
JaredPar

Abstrakte Klassen und Interfaces sind semantisch unterschiedlich, obwohl sich ihre Verwendung überschneiden kann.

Eine abstrakte Klasse wird im Allgemeinen als Grundlage für die Erstellung ähnlicher Klassen verwendet. Die für die Klassen übliche Implementierung kann in der abstrakten Klasse erfolgen.

Eine Schnittstelle wird im Allgemeinen verwendet, um eine Fähigkeit für Klassen anzugeben, bei denen die Klassen nicht sehr ähnlich sein müssen.

78
Guffa

Da es keine Mehrfachvererbung gibt, sollten Sie eine Schnittstelle verwenden, wenn Sie möchten, dass eine Klasse Ihre Schnittstelle/abstrakte Klasse implementieren/erben kann, aber von einer anderen Basisklasse erbt.

8
Zifre

Die eigentliche Frage ist, ob Schnittstellen oder Basisklassen verwendet werden sollen. Dies wurde bereits früher behandelt.

In C # ist eine abstrakte Klasse (eine mit dem Schlüsselwort "abstract" gekennzeichnete) einfach eine Klasse, aus der Sie keine Objekte instanziieren können. Dies dient einem anderen Zweck als der einfachen Unterscheidung zwischen Basisklassen und Schnittstellen.

5