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? ?

1voto

annakata Punkte 72408

Reine Auf der Grundlage der Vererbung würden Sie ein Abstract verwenden, wenn Sie eindeutig absteigende, abstrakte Beziehungen definieren (z. B. Tier->Katze) und/oder die Vererbung virtueller oder nicht-öffentlicher Eigenschaften erfordern, insbesondere von gemeinsam genutzten Zuständen (die von Interfaces nicht unterstützt werden).

Sie sollten versuchen, Komposition (über Dependency Injection) gegenüber Vererbung zu bevorzugen, wo immer es möglich ist, und beachten Sie, dass Interfaces als Verträge Unit-Tests, Separation of Concerns und (sprachlich variierende) Mehrfachvererbung in einer Weise unterstützen, wie es Abstracts nicht können.

1voto

Mesh Punkte 5948

Dies kann eine sehr schwierige Entscheidung sein...

Einen Hinweis kann ich geben: Ein Objekt kann viele Schnittstellen implementieren, während ein Objekt nur eine Basisklasse erben kann (in einer modernen OO-Sprache wie c#, ich weiß, C++ hat Mehrfachvererbung - aber ist das nicht verpönt?)

0voto

Gerrie Schenck Punkte 21800

Eine abstrakte Klasse kann Implementierungen haben.

Eine Schnittstelle hat keine Implementierungen, sie definiert lediglich eine Art Vertrag.

Es kann auch einige sprachabhängige Unterschiede geben: C# kennt beispielsweise keine Mehrfachvererbung, aber mehrere Schnittstellen können in einer Klasse implementiert werden.

0voto

satheesh Punkte 41

Wenn wir eine Implementierung haben, die für alle abgeleiteten Klassen gleich ist, ist es besser, eine abstrakte Klasse als eine Schnittstelle zu verwenden. Wenn wir eine Schnittstelle haben, können wir unsere Implementierung in jede Klasse verschieben, die die Schnittstelle implementiert. Bei einer abstrakten Klasse wird die Verdoppelung des Codes vermieden und die Implementierung für alle abgeleiteten Klassen gemeinsam genutzt. Die Schnittstellen ermöglichen die Entwicklung lose gekoppelter Systeme, was zu besseren Tests führt.

0voto

Mohammadreza Punkte 3023

Beide sind Vertrag für die Klassendefinition:

Schlussfolgerung 1: Beide Absichten sind Gegenstand Verallgemeinerung

Bei der Definition von abstrakten Klassen können diese über Standard Umsetzung auch .

Schlussfolgerung 2: Unterscheidung ist in Verallgemeinerung von Verhaltensweisen Gestaltung

Bei der Verwendung von abstrakten Klassen können Klassen von nur einer abstrakten Klasse erben

Schlussfolgerung 3: Eine abstrakte Klasse kann nur begrenzt genutzt werden. Das bedeutet Beschränkung der Verallgemeinerung des Verhaltens .

Abschließende Schlussfolgerung - Wann ist was zu verwenden? Distinguish ist in Niveau der Verhaltensgeneralisierung

Beim Entwurf des Verhaltens von Klassen, wenn die Funktionalität nur konzeptionell begrenzt auf bestimmte Klassen oder mit anderen Worten, ist unter bestimmten Klasse teilen, verwenden abstrakte Klasse. aber wenn Funktionalität ist allgemeiner als bestimmte Klassen oder wir kann/will hinzufügen Funktionalität an andere Klassen weiterzugeben, verwenden Sie die Schnittstelle als Vertrag.

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