webentwicklung-frage-antwort-db.com.de

Was ist der Unterschied zwischen einer abstrakten Klasse und einer Schnittstelle?

Angenommen, wir haben zwei Methoden M1() und M2() in einer Schnittstelle. Eine abstrakte Klasse verfügt ebenfalls über dieselben zwei abstrakten Methoden. Wenn eine Klasse diese Schnittstelle implementiert oder von der abstrakten Klasse geerbt hat, muss sie beide darin enthaltenen Methoden implementieren.

Mir scheint, dass eine Schnittstelle oder eine abstrakte Klasse sich für mein Szenario gleich verhält. Kann jemand den Unterschied zwischen diesen beiden in diesem speziellen Fall hervorheben und vorschlagen, ob hier eine abstrakte Klasse oder eine Schnittstelle verwendet werden soll?

47
WpfBee

Es gibt technische Unterschiede zwischen abstrakten Klassen und Interfaces, da eine abstrakte Klasse die Implementierung von Methoden, Feldern, Konstruktoren usw. enthalten kann, während ein Interface nur Methoden- und Eigenschaftsprototypen enthält. Eine Klasse kann mehrere Schnittstellen implementieren, jedoch nur eine Klasse (abstrakt oder anderweitig) erben.

Meiner Meinung nach ist der wichtigste Unterschied zwischen Interfaces und Abstract Classes der semantische Unterschied.

Eine Schnittstelle definiert, was etwas kann tun (wie es sich verhält), und eine abstrakte Klasse definiert, was etwas ist.

Nehmen wir zum Beispiel IEnumerable, die semantische Bedeutung dahinter ist, dass alles, was IEnumerable implementiert, aufzählbar ist. Dies bedeutet nicht, dass es sich um eine Aufzählung handelt, sondern dass es sich wie eine solche verhalten kann (aufgezählt werden kann) ).

Stellen Sie sich vor, dass bei einem Waschmaschinenbeispiel alles, was es erbt, eine Art Waschmaschine ist. Alles, was es erbt, wäre eine Art Waschmaschine, ein Toplader oder Seitenlader usw.

Wenn Sie stattdessen eine Schnittstelle namens ICanWash hätten, die eine Methode namens Wash enthalten könnte. Sie könnten verschiedene Dinge implementieren lassen ICanWash, sei es eine Person, eine abstrakte Waschmaschinenklasse, usw., wobei die tatsächliche Implementierung keine Rolle spielt. Sie müssen nur wissen, dass das Verhalten so ist, wie es ist kann Sachen waschen.

Zusammenfassend definieren Klassen, was etwas ist, Schnittstellen, was etwas tun kann.

123
Matthew

Von MSDN :

Mithilfe von Schnittstellen können Sie beispielsweise Verhalten aus mehreren Quellen in eine Klasse einbeziehen. Diese Funktion ist in C # wichtig , da die Sprache die Mehrfachvererbung von Klassen nicht unterstützt .

Verwenden Sie also die Schnittstelle, wenn Sie möchten, dass jede Klasse diese Methoden erben kann.

Von derselben MSDN-Seite:

Außerdem müssen Sie eine Schnittstelle verwenden, um die Vererbung von Strukturen zu simulieren, da diese nicht von einer anderen Struktur oder Klasse erben können.

3
Fabio

Mit Interface kann eine Klasse mehr als ein Interface erben/implementieren, während Sie in C # nur von einer Klasse erben können.

Im Grunde genommen Mehrfachvererbung.

1
CharlesW

Die abstrakte Klasse enthält nicht nur abstrakte Methoden, sondern möglicherweise auch andere Felder und Methoden mit Implementierung. In c # können Sie nicht von Multipule-Klassen erben, aber Sie können Multipule-Schnittstellen implementieren. Die kurze Antwort lautet also: Verwenden Sie nach Möglichkeit Schnittstellen und keine abstrakten Klassen. In Ihrem Beispiel ist es möglich und daher empfehlenswert, eine Schnittstelle zu verwenden.

1
omer schleifer

Zwei kurze Gedanken zu Unterschieden zwischen Interfaces und abstrakten Klassen:

  1. Abstrakte Klassen erwünscht, wenn eine zukünftige Erweiterung wahrscheinlich ist, da eine abstrakte Klasse erweitert werden kann, aber eine Schnittstelle durch Hinzufügen einer anderen Schnittstelle, I2, erweitert werden müsste.
  2. Einzelne (Implementierungs-) Vererbung bedeutet, dass abstrakte Klassen sorgfältig ausgewählt werden, um die wahre Grundnatur möglichst gut widerzuspiegeln. Schnittstellen können leicht zu einer Implementierung hinzugefügt werden, aber eine abstrakte Klasse kann nur hinzugefügt werden, wenn noch keine vorhanden ist.
1
Pieter Geerkens