Wann wird eine abstrakte Klasse im Vergleich zur Schnittstelle in C # verwendet?

Beim Entwerfen von Anwendungen ist es wichtig zu wissen, wann eine abstrakte Klasse und wann eine Schnittstelle verwendet werden muss. Obwohl abstrakte Klassen und Schnittstellen in gewisser Weise ähnlich erscheinen, gibt es wichtige Unterschiede, die bestimmen, welche die beste Wahl für das ist, was Sie erreichen möchten. In diesem Blog-Beitrag werde ich diese Unterschiede diskutieren und wie man entscheidet, wann man welche verwendet.

Die kurze Antwort: Mit einer abstrakten Klasse können Sie Funktionen erstellen, die Unterklassen implementieren oder überschreiben können. Mit einer Schnittstelle können Sie nur Funktionen definieren, nicht implementieren. Und während eine Klasse nur eine abstrakte Klasse erweitern kann, kann sie mehrere Schnittstellen nutzen. 

C # abstrakte Klasse erklärt

Eine abstrakte Klasse ist ein spezieller Klassentyp, der nicht instanziiert werden kann. Eine abstrakte Klasse soll von Unterklassen geerbt werden, die ihre Methoden entweder implementieren oder überschreiben. Mit anderen Worten, abstrakte Klassen sind entweder teilweise oder gar nicht implementiert. Sie können Funktionen in Ihrer abstrakten Klasse haben - die Methoden in einer abstrakten Klasse können sowohl abstrakt als auch konkret sein. Eine abstrakte Klasse kann Konstruktoren haben - dies ist ein wesentlicher Unterschied zwischen einer abstrakten Klasse und einer Schnittstelle. Sie können abstrakte Klassen nutzen, um Komponenten zu entwerfen und eine Ebene allgemeiner Funktionen anzugeben, die von abgeleiteten Klassen implementiert werden müssen.

C # -Schnittstelle erklärt

Eine Schnittstelle ist im Grunde ein Vertrag - sie hat keine Implementierung. Eine Schnittstelle kann nur Methodendeklarationen enthalten. Es darf keine Methodendefinitionen enthalten. Sie können auch keine Mitgliedsdaten in einer Schnittstelle haben. Während eine abstrakte Klasse Methodendefinitionen, Felder und Konstruktoren enthalten kann, enthält eine Schnittstelle möglicherweise nur Deklarationen von Ereignissen, Methoden und Eigenschaften. In einer Schnittstelle deklarierte Methoden müssen von den Klassen implementiert werden, die die Schnittstelle implementieren. Beachten Sie, dass eine Klasse mehr als eine Schnittstelle implementieren kann, aber nur eine Klasse erweitert. Die Klasse, die die Schnittstelle implementiert, sollte alle ihre Mitglieder implementieren. Wie eine abstrakte Klasse kann eine Schnittstelle nicht instanziiert werden.

Soll ich eine abstrakte Klasse oder eine Schnittstelle verwenden?

Abstrakte Klassen bieten Ihnen die Flexibilität, über bestimmte konkrete Methoden und einige andere Methoden zu verfügen, die die abgeleiteten Klassen implementieren sollten. Wenn Sie dagegen Schnittstellen verwenden, müssen Sie alle Methoden in der Klasse implementieren, die die Schnittstelle erweitert. Eine abstrakte Klasse ist eine gute Wahl, wenn Sie Pläne für eine zukünftige Erweiterung haben - dh wenn eine zukünftige Erweiterung in der Klassenhierarchie wahrscheinlich ist. Wenn Sie die zukünftige Erweiterung bei der Verwendung von Schnittstellen unterstützen möchten, müssen Sie die Schnittstelle erweitern und eine neue erstellen.

Aus einem anderen Grund ist es einfach, der Hierarchie bei Bedarf eine neue Schnittstelle hinzuzufügen. Wenn Sie jedoch bereits eine abstrakte Klasse in Ihrer Hierarchie haben, können Sie keine weitere hinzufügen. Sie können also nur dann eine abstrakte Klasse hinzufügen, wenn keine verfügbar ist. Sie sollten eine Schnittstelle verwenden, wenn Sie einen Vertrag über ein Verhalten oder eine Funktionalität wünschen. Sie sollten keine Schnittstelle verwenden, wenn Sie denselben Code für die Schnittstellenmethoden schreiben müssen. In diesem Fall sollten Sie eine abstrakte Klasse verwenden, die Methode einmal definieren und bei Bedarf wiederverwenden. Verwenden Sie Schnittstellen, um den Code Ihrer Anwendung von bestimmten Implementierungen zu entkoppeln oder den Zugriff auf Mitglieder eines bestimmten Typs zu beschränken.

In der Dokumentation der Schnittstellen von Microsoft heißt es:

Mithilfe von Schnittstellen können Sie beispielsweise Verhalten aus mehreren Quellen in eine Klasse aufnehmen. Diese Funktion ist in C # wichtig, da die Sprache keine Mehrfachvererbung von Klassen unterstützt. Darüber hinaus müssen Sie eine Schnittstelle verwenden, wenn Sie die Vererbung für Strukturen simulieren möchten, da diese nicht von einer anderen Struktur oder Klasse erben können.

Implizite und explizite Schnittstellenimplementierungen

Schnittstellen können implizit oder explizit implementiert werden. Lassen Sie mich erklären, wie sich diese beiden Implementierungen unterscheiden. Betrachten Sie eine Schnittstelle namens IBusinessLogic.

öffentliche Schnittstelle IBusinessLogic

{

   void Initialize ();

}}

Die folgende Klasse mit dem Namen BusinessLogicimplementiert die IBusinessLogicSchnittstelle.

öffentliche Klasse BusinessLogic: IBusinessLogic

{

   public void Initialize ()

   {

       // Code

   }}

}}

Sie können eine Instanz der BusinessLogicKlasse explizit erstellen und dann die Initialize()unten gezeigte Methode aufrufen .

 IBusinessLogic businessLogic = new BusinessLogic ();

businessLogic.Initialize ();

Das folgende Codefragment zeigt, wie Sie die IBusinessLogicSchnittstelle implizit implementieren können.

öffentliche Klasse BusinessLogic: IBusinessLogic

{

   void IBusinessLogic.Initialize ()

   {

   }}

}}

Sie können die Initialize()Methode jetzt auf die gleiche Weise aufrufen , indem Sie auf die IBusinessLogicSchnittstelle verweisen . Der Unterschied zwischen den beiden Ansätzen besteht darin, dass Sie beim expliziten Implementieren der Schnittstelle in Ihrer Klasse nur eine Methode Ihrer Schnittstelle aufrufen müssen, die nur auf die Schnittstelle verweist. Daher würde das folgende Code-Snippet nicht funktionieren, dh nicht kompilieren.

 BusinessLogic businessLogic = new BusinessLogic ();

businessLogic.Initialize ();

So machen Sie mehr in C #:

  • Wann wird eine abstrakte Klasse im Vergleich zur Schnittstelle in C # verwendet?
  • So arbeiten Sie mit AutoMapper in C #
  • Verwendung von Lambda-Ausdrücken in C #
  • So arbeiten Sie mit Action-, Func- und Predicate-Delegaten in C #
  • So arbeiten Sie mit Delegierten in C #
  • So implementieren Sie einen einfachen Logger in C #
  • So arbeiten Sie mit Attributen in C #
  • So arbeiten Sie mit log4net in C #
  • So implementieren Sie das Repository-Entwurfsmuster in C #
  • Wie man mit Reflexion in C # arbeitet
  • So arbeiten Sie mit dem Dateisystemwatcher in C #
  • So führen Sie eine verzögerte Initialisierung in C # durch
  • So arbeiten Sie mit MSMQ in C #
  • So arbeiten Sie mit Erweiterungsmethoden in C #
  • Wie wir Lambda-Ausdrücke in C #
  • Wann wird das flüchtige Schlüsselwort in C # verwendet?
  • Verwendung des Schlüsselwortsield in C #
  • So implementieren Sie Polymorphismus in C #
  • So erstellen Sie Ihren eigenen Taskplaner in C #
  • So arbeiten Sie mit RabbitMQ in C #
  • So arbeiten Sie mit einem Tupel in C #
  • Erkundung virtueller und abstrakter Methoden in C #