C# Interfaces

Warum Interfaces

Interfaces ermöglichen es uns diese Qualitätsansprüche an unsere Anwendung zu erreichen.

  • Wartbarkeit
  • Erweiterbarkeit
  • Testbarkeit

Interfaces, Abstrakten Klassen, Konkreten Klassen

Um zu verstehen wie Interfaces funktionieren schauen wir uns zuerst ein paar Beispiel implementierungen an.

Concrete Class: Eine konkrete Klasse ist eine normale Klasse, im folgenden Beispiel nutzen wir diese "normale" Klasse als Basisklasse unseres Polygon. Eine konkrete Klasse bietet uns hierbei keinerlei unterstützung in der implementierung und ist daher sehr Fehleranfällig.

In diesem Beispiel lässt sich erkennen das durch das entfernen einer Methode der Code weiterhin komplierbar aber nicht mehr funktionsfähig ist.

Dies macht die Nutzung an dieser Stelle Fehleranfällig, Abhilfen schaft eine Abstrakte Klasse oder Interfaces.

Abstract Class: Eine Klasse die eine oder mehrere Abstract Member hat. Ein Abstract Member ist ein Class Member welcher deklariert aber nicht implementiert ist, also keinen Methodenbody besitzt. In Klassen müssen alle Inerhited Member implementiert werden, abstrakte Klassen sind daher anders als Konkrete Klassen weniger Fehleranfällig.

Sobald eine Klasse einen Abstrakten Member besitzt muss die Klasse als Abstrakte Klasse deklariert werden. Von Abstrakten Klassen kann keine Instanz erzeugt werden.

Interface dürfen ausschließlich Deklarationen besitzen, implementierungen sind nicht erlaubt. Alle Members des Interface sind automatisch public. Alle Members eines Interface müssen in der Klasse die dieses Interface nutzt implementiert werden (am besten lässt sich ein Interface mit einem Vertrag vergleichen).

Was sind die Unterschiede zwischen abstract und interface?

Abstract Class Interface
Prüfung Prüfung zur Komplierzeit Prüfung zur Komplierzeit
Implementierung Können implementierungen enthalten Enthalten keine implementierungen (lediglich deklarationen)
Vererbung Eine Klasse kann nur von einer Abstrakten Klasse erben Eine Klasse kann jedoch eine beliebige Anzahl an Interface implementieren
Access Modifier Abstrakte Klassenmember können Zugriffsmodifier enthalten Alle Interface Member sind automatisch public
Erlaubte Member Fields, Properties, Construcotrs, Destructors, Methods, Events, Indexers Properties, Methods, Events, Indexers

Best Practice

Program to an interface rather than a concrete class or Program to an interface rather than a concrete class. Das arbeiten gegen Interfaces ermöglicht es uns Zukunftssicheren Code zu erstellen.

Interfaces Erweitern

Ein Interface ist ein Vertrag und kann nicht einfach geändert werden. Das entfernen oder hinzufügen von Interface Membern hätten kompilierfehler zur folge. Mit hilfe von Interface Inheritance können wir jedoch neue Funktionen zu bestehenden Interfaces hinzufügen.

Nehmen wir als Beispiel folgendes Interface

eine Erweiterung um eine Methode hätte zur folge das alle Klassen die dieses Interface nutzen angepasst und oder nicht mehr komplierfähig wären.

eine bessere alternative ist das hinzufügen eines weiteren Interface, bestehende implementierungen von ISavable werden hierdurch nicht beeinflusst. Wenn die neue Funktionalität genutzt werden soll kann jetzt auf das neue Interface zurückgegriffen werden.

Summary

Mit diesem Beitrag verstehen wir jetzt die Unterschiede zwischen Abstrakten Klassen und Interfaces, wissen welche Vorteile uns Interfaces bieten und wie sie eingesetzt werden können. Trotzdem deckt dieser Beitrag nur einen kleine Teil der Funktionalitäten und Einsatzmöglichkeiten von Interfaces ab sodass weitere Beiträge folgen werden in welchen wir Interaces intensiv nutzen.