mk-prg-net \net \oo \interface-vs-abstract-class

Schnittstellenimplementierung vs. Implementierungvererbung

Im Sinne der Oberbegriffsbildung kann man auf Klassen abstrahieren. Die Abstraktionen können als Basisklassen oder Schnittstellen in C# beschrieben werden.

Basisklassen

Eine Basisklasse ist eine Klasse, von der eine abgeleitete Klasse durch eine Vererbungsbeziehung allgemeine Eigenschafften und Methoden erbt. Jede Klasse kann von genau einer Basisklasse erben (1:n Beziehung).

Mit den Eigenschaften und Methoden werden auch deren Implementierungen vererbt → Implementierungen in Basisklassen stellen allgemeine Verfahren dar. Diese Implementierungen sind fest und nicht austauschbar !

Beispiel: Eigenschaft Masse_in_kg aus der Klasse Galaxie implementiert die Berechnung der Masse einer Glaxie durch ∑(Massen Sterne) + ∑(Massen der Planeten).

Problem: Die Anforderungen an die Berechnung der Masse einer Galaxie könnten sich später ändern. Die Masse z.B. von Asteroiden, Kometen und Staubwolken wird in der aktuellen Implementierung noch nicht berücksichtigt. Es könnten auch von Fall zu Fall an die Masseberechnung unterschiedliche Genauigkeitsanforderungen gestellt werden. Bezüglich dieser Anforderungen sind die Implementierung in Basisklassen unflexibel !

Schnittstellen

Eine Schnittstelle definiert eine Liste von Eigenschaften, Methoden und Ergeignisse, die eine Klasse public implementieren muss. Klassen können viele Schnittstellen implementieren (m:n Beziehung).

Beispiel: Galaxien, Sterne und Planeten implementieren die Schnittstelle IHimmelkörper, indem die Eigenschaften Name und Masse_in_kg implementiert werden.
Die abstrakte Klasse Astro.Galaxie implementiert Masse_in_Kg durch das allgemeine Verfahren ∑(Massen Sterne) + ∑(Massen der Planeten). Name wird durch Deklaration einer abstrakten Eigenschaft "implementiert" → die reale Implementierung wird auf die Klasse Astro.inMem.Galaxie verschoben.

Flexiblere Implementierung der Masseberechnung mittels Schnittstellen und dem Strategie- Pattern

Das Strategie- Pattern schlägt die Implementierung von Klassen vor, in denen die Implementierung von Berechnungen innerhalb von Eigenschaften und Methoden austauschbar sind.

Die Berechnung der Masse einer Galaxie ist ein Kandidat für das Strategie- Pattern. → CSharp45.Basics\_04_Objektorientiert\Astro\GalaxieWithStrategie

Vergleich

  Basisklasse Schnittstelle
Vorteile
  1. Klasse implizit in Basisklasse konvertierbar → Abstraktion
  2. Basisklassen- Member können allgemeine Verfahren implementieren und abgeleiteten Klassen bereitstellen → Implementierungsvererbung
  1. Klasse implizit in Schnittstelle konvertierbar bei impliziter Implementierung → Abstraktion
  2. Klassen können mehrere Schnittstellen implementieren → mehrfache Abstraktion
Nachteile
  1. Klassen können nur von einer Basisklasse erben → keine Mehrfachvererbung
  2. Von den Implementierung in Basisklassen kann die Funktionsweise ganzer Klassenhierarchien abhängen → Basisklassenimplementierungen schwer wartbar.
  1. Reine Strukturdefinitionen, keine vererbung von Implementierungen möglich.