522 Stimmen

Wann sollte man eine Schnittstelle anstelle einer abstrakten Klasse verwenden und umgekehrt?

Dies könnte eine allgemeine OOP-Frage sein. Ich wollte einen generischen Vergleich zwischen einer Schnittstelle und einer abstrakten Klasse auf der Grundlage ihrer Verwendung anstellen.

Wann würde man eine Schnittstelle und wann eine abstrakte Klasse verwenden wollen? ?

41voto

sunwukung Punkte 2685

OK, nachdem ich es gerade selbst "begriffen" habe - hier ist es in Laiensprache (bitte korrigieren Sie mich, wenn ich falsch liege) - ich weiß, dass dieses Thema gaaanz alt ist, aber vielleicht stolpert jemand anderes eines Tages darüber...

Mit abstrakten Klassen können Sie einen Entwurf erstellen und zusätzlich Eigenschaften und Methoden KONSTRUIEREN (implementieren), die ALLE ihre Nachkommen besitzen sollen.

Bei einer Schnittstelle hingegen können Sie nur angeben, dass Eigenschaften und/oder Methoden mit einem bestimmten Namen in allen Klassen vorhanden sein sollen, die sie implementieren - aber nicht, wie Sie sie implementieren sollen. Außerdem kann eine Klasse VIELE Schnittstellen implementieren, aber nur EINE abstrakte Klasse erweitern. Eine Schnittstelle ist eher ein hochrangiges architektonisches Werkzeug (was klarer wird, wenn man anfängt, Entwurfsmuster zu verstehen) - eine abstrakte Klasse hat einen Fuß in beiden Lagern und kann auch einen Teil der schmutzigen Arbeit erledigen.

Warum sollte man das eine dem anderen vorziehen? Ersteres ermöglicht eine bessere Beton Definition der Nachkommenschaft - letztere ermöglicht eine größere Polymorphismus . Dieser letzte Punkt ist für den Endnutzer/Codierer wichtig, der diese Informationen zur Implementierung des A.P. nutzen kann. I(nterface) in einer Vielzahl von Kombinationen/Formen, um ihren Bedürfnissen gerecht zu werden.

Ich glaube, das war für mich der entscheidende Moment - Schnittstellen weniger aus der Sicht des Autors zu betrachten, sondern mehr aus der Sicht eines späteren Programmierers, der ein Projekt implementiert, oder Erweiterung eine API.

31voto

Aamir Punkte 14354

Wann was zu tun ist, ist eine sehr einfache Sache, wenn man das Konzept klar vor Augen hat.

Abstrakte Klassen können abgeleitet werden, während Interfaces implementiert werden können. Es gibt einen Unterschied zwischen den beiden. Wenn Sie eine abstrakte Klasse ableiten, ist die Beziehung zwischen der abgeleiteten Klasse und der Basisklasse eine "ist ein"-Beziehung. z.B. ein Hund ist ein Tier, ein Schaf ist ein Tier, was bedeutet, dass eine abgeleitete Klasse einige Eigenschaften von der Basisklasse erbt.

Bei der Implementierung von Schnittstellen hingegen ist die Beziehung "kann sein". z. B. kann ein Hund ein Spürhund sein. Ein Hund kann ein Zirkushund sein. Ein Hund kann ein Rennhund sein. Das bedeutet, dass man bestimmte Methoden implementiert, um etwas zu erwerben.

Ich hoffe, ich habe mich klar ausgedrückt.

13voto

kuttychutty Punkte 151

1. wenn Sie etwas erstellen, das gemeinsame Funktionen für nicht verwandte Klassen bereitstellt, verwenden Sie eine Schnittstelle.

2. wenn Sie etwas für Objekte erstellen, die in einer Hierarchie eng miteinander verbunden sind, verwenden Sie eine abstrakte Klasse.

13voto

Satya Punkte 548

Wann ist eine abstrakte Klasse einer Schnittstelle vorzuziehen?

  1. Wenn man plant, eine Basisklasse während der Laufzeit eines Programms/Projekts zu aktualisieren, ist es am besten, wenn die Basisklasse eine abstrakte Klasse ist
  2. Wenn man versucht, ein Grundgerüst für Objekte zu schaffen, die in einer Hierarchie eng miteinander verbunden sind, ist es sehr vorteilhaft, eine abstrakte Klasse zu verwenden

Wann ist eine Schnittstelle einer abstrakten Klasse vorzuziehen?

  1. Wenn man es nicht mit einem massiven hierarchischen Rahmen zu tun hat, wären Schnittstellen eine gute Wahl
  2. Da Mehrfachvererbung bei abstrakten Klassen nicht möglich ist (Diamantenproblem), können Schnittstellen den Tag retten

12voto

Mazhar Punkte 186

Klassen können nur von einer Basisklasse erben. Wenn Sie also abstrakte Klassen verwenden wollen, um einer Gruppe von Klassen Polymorphismus zu bieten, müssen diese alle von dieser Klasse erben. Abstrakte Klassen können auch Mitglieder bereitstellen, die bereits implementiert wurden. Daher können Sie mit einer abstrakten Klasse ein gewisses Maß an identischer Funktionalität sicherstellen, was mit einer Schnittstelle nicht möglich ist.

Im Folgenden finden Sie einige Empfehlungen, die Ihnen bei der Entscheidung helfen sollen, ob Sie eine Schnittstelle oder eine abstrakte Klasse verwenden sollten, um Polymorphie für Ihre Komponenten zu ermöglichen.

  • Wenn Sie vorhaben, mehrere Versionen Ihrer Komponente zu erstellen, erstellen Sie eine abstrakte Klasse. Abstrakte Klassen bieten eine einfache und leichte Möglichkeit, Ihre Komponenten zu versionieren. Wenn Sie die Basisklasse aktualisieren, werden alle vererbenden Klassen automatisch mit der Änderung aktualisiert. Schnittstellen hingegen können nicht geändert werden, sobald sie auf diese Weise erstellt wurden. Wenn eine neue Version einer Schnittstelle erforderlich ist, müssen Sie eine völlig neue Schnittstelle erstellen.
  • Wenn die Funktionalität, die Sie erstellen, für eine Vielzahl unterschiedlicher Objekte nützlich sein wird, verwenden Sie eine Schnittstelle. Abstrakte Klassen sollten in erster Linie für Objekte verwendet werden, die eng miteinander verwandt sind, während Schnittstellen am besten geeignet sind, um nicht verwandten Klassen gemeinsame Funktionen zur Verfügung zu stellen.
  • Wenn Sie kleine, überschaubare Funktionseinheiten entwerfen wollen, sollten Sie Schnittstellen verwenden. Wenn Sie große Funktionseinheiten entwerfen, verwenden Sie eine abstrakte Klasse.
  • Wenn Sie eine gemeinsame, implementierte Funktionalität für alle Implementierungen Ihrer Komponente bereitstellen möchten, verwenden Sie eine abstrakte Klasse. Abstrakte Klassen ermöglichen es Ihnen, Ihre Klasse teilweise zu implementieren, während Schnittstellen keine Implementierung für irgendwelche Mitglieder enthalten.

Kopiert von:
http://msdn.microsoft.com/en-us/library/scsyfw1d%28v=vs.71%29.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X