Abstrakte Klasse oder Schnittstelle. Welcher Weg ist richtig?

8

Es gibt zwei Möglichkeiten, zwischen abstrakter Klasse oder Schnittstelle zu wählen. Microsoft-Lösung und Oracle-Lösung:

Microsoft, Design-Richtlinie:

Verwenden Sie abstrakte (MustInherit in Visual Basic) Klassen anstelle von Schnittstellen, um den Vertrag von Implementierungen zu entkoppeln.

Ссылка

Oracle, Die Java-Lernprogramme:

Wenn eine abstrakte Klasse nur abstrakte Methodendeklarationen enthält, sollte sie stattdessen als Schnittstelle deklariert werden.

Ссылка

Meine Frage ist, welcher Weg richtig ist? Microsoft- oder Oracle-Lösung? Beachten Sie, dass ich denke, zwischen abstrakter Klasse oder Schnittstelle wählen sollte nicht von der Programmiersprache (Java oder C #) abhängt.

    
Amir Saniyan 11.02.2012, 20:00
quelle

3 Antworten

10

Wenn ich daran denke, dass mein Blog korrekt gelesen wurde, stammt die Empfehlung von Microsoft, abstrakte Klassen zu verwenden, aus der Möglichkeit, die Implementierung mit einer abstrakten Klasse wiederzuverwenden, was mit einer Schnittstelle nicht möglich ist.

Beachten Sie außerdem, dass die Microsoft-Seite, auf die Sie verlinkt haben, speziell Anleitungen zum Schreiben von Codebibliotheken für die gemeinsame Nutzung / Wiederverwendung in mehreren Projekten enthält. Die Wahrscheinlichkeit in dieser Situation ist, dass Sie alle Implementierungen der Schnittstelle selbst wahrscheinlich innerhalb derselben Baugruppe schreiben werden. Gute Praktiken für die Arbeit an einem einzelnen Produkt oder System werden etwas variieren.

Ein gängiger Ansatz, den ich in einer Reihe von Codebasen in einer Reihe von Sprachen gesehen habe, ist:

  • Definieren Sie eine Schnittstelle zur Angabe des Vertrags
  • Erstellen Sie eine abstrakte Klasse, die den Vertrag implementiert, um eine allgemeine Implementierung bereitzustellen, die für alle Nachkommen nützlich ist
  • Implementierungen des Vertrags haben dann die Möglichkeit, bequem von der Basisklasse aus zu starten oder die Schnittstelle zu implementieren, wenn sie die volle Kontrolle haben wollen

Ein vierter Schritt, der in der .NET-Welt üblich ist, ist die Bereitstellung von Komfort-Erweiterungsfunktionen, die auf der Schnittstelle basieren.

    
Bevan 11.02.2012, 20:06
quelle
7

Sie sind 2 Aussagen für verschiedene Kontexte.

Die von Ihnen zitierte Microsoft-Richtlinie lautet "Designing Class Libraries". Und es gibt den Grund dafür, abstrakte Klassen dort zu bevorzugen: Man kann Funktionalität hinzufügen, ohne etwas zu brechen.

Zur Trennung und Entkopplung über Layer und andere Grenzen berät Microsoft auch Schnittstellen.

    
Henk Holterman 11.02.2012 20:11
quelle
1

Eine Schnittstelle enthält keine Implementierung - es ist ein Vertrag. Es ermöglicht eine vollständige Entkopplung.

Ich werde von einer Schnittstelle zu einer abstrakten (Basis-) Klasse wechseln, wenn ich eine gemeinsame Implementierung bereitstellen möchte, während die konkrete Klasse der erbenden Klasse gezwungen werden soll, einige spezifische Implementierungen für diese Klasse bereitzustellen. Das ist ein bisschen weniger Entkopplung.

Seien Sie sich auch bewusst, dass viele Sprachen wie C # (und .net-Sprachen wie VB.net usw.) sowie Java keine Mehrfachvererbung zulassen, so dass Interfaces zu einer Möglichkeit werden, einer Klasse viele Verhaltensweisen zu ermöglichen.

    
bryanmac 11.02.2012 20:07
quelle