OO-Paradigmen

Assoziation

Eine Assoziation beschreibt eine Beziehung zwischen zwei Typen, im häufigsten Fall eine Verbindung zwischen zwei Objekten der
Klassen

Assoziationsenden

Eine Assoziation bildet eine Art Brücke zwischen zwei Typen: startet man bei der Instanz des einen beteiligten Typs kann man über eine Objektbeziehung zur Instanz des zweiten Typs navigieren.

  • 1) Keine Aussage zur Navigierbarkeit. Das Modell macht keine Aussage zur Navigierbarkeit. Sie ist unspezifiziert und soll erst zu einem späteren Zeitpunkt, zum Beispiel beim Softwaredesign, definiert werden.
  • 2) Erlaubte Navigation. Das Modell erlaubt die Navigation über das Assoziationsende.
  • 3) Nicht erlaubte Navigation. Das Modell verbietet die Navigation über das Assoziationsende.
Assoziationsenden
Möchte man nun ein Assoziationsende hervorheben oder die Bindung einer Assoziation verstärken, so stehen einem Aggregation
und Komposition als Mittel zur Verfügung.

Aggregation

Eine exakte Definition wird in der UML2 nicht gegeben, vielmehr wird darauf verwiesen, dass eine Aggregation je nach Anwendung und Modellierer variiert. Ein konkreter Nutzen lässt sich z.B. ableiten indem man einem Ende einer Assoziation eine besondere Betonung zukommen lässt.

Grundsätzlich ist die Abgrenzung zwischen Assoziation und Aggregation schwierig. Ein schwaches Indiz für die sinnvolle
Verwendung einer Aggregation scheint das Vorliegen von Transitivitäten zwischen den modellierten Klassen zu sein. D.h. wenn
zwischen A und B eine Teil/Ganze-Beziehung existiert und zwischen B und C ebenfalls, dann muss A auch ein Teil von C sein.

 

Aggregation

Komposition

Die Komposition beschreibt die Beziehung zwischen einem Ganzen und seiner Teile.

Ein Teil kann immer nur genau einem Ganzen zugeordnet sein. Teile, die über eine Komposition mit einem Ganzen verbunden sind,
dürfen jeweils in höchstens einem (0..1) Ganzen vorkommen.

 

Komposition

Datenkapselung

Als Datenkapselung bezeichnet man in der Programmierung das Verbergen von Daten oder Informationen vor dem Zugriff von außen.
Der direkte Zugriff auf die interne Datenstruktur wird unterbunden und erfolgt statt dessen über definierte Schnittstellen.

Zugriffsarten

  • public (+)
    • zugreifbar für alle Ausprägungen (auch die anderer Klassen),
  • private (-)
    • Nur für Ausprägungen der eigenen Klasse zugreifbar,
  • protected (#)
    • Nur für Ausprägungen der eigenen Klasse und von Spezialisierungen derselben zugreifbar,

Vorteile der Kapselung

  • Da die Implementierung einer Klasse anderen Klassen nicht bekannt ist, kann die Implementierung geändert werden, ohne die Zusammenarbeit mit anderen Klassen zu beeinträchtigen.
  • Erhöhte Übersichtlichkeit, da nur die öffentliche Schnittstelle einer Klasse betrachtet werden muss.
  • Beim Zugriff über eine Zugriffsfunktion spielt es von außen keine Rolle, ob diese Funktion 1:1 im Inneren der Klasse existiert, das Ergebnis einer Berechnung ist, oder möglicherweise aus anderen Quellen (z. B. einer Datei oder Datenbank) stammt.
  • Deutlich verbesserte Testbarkeit, Stabilität und Änderbarkeit der Software bzw. deren Teile (Module).

Nachteile der Kapselung

  • In Abhängigkeit vom Anwendungsfall Geschwindigkeitseinbußen durch den Aufruf der Methode (direkter Zugriff auf die Datenelemente wäre schneller).
  • Zusätzlicher Programmieraufwand für die Erstellung der Zugriffsmethoden.

Polymorphie

Bedeutung

Polymorphie' (polymorphism = Vielgestaltigkeit) ist neben Kapselung und Vererbung die dritte Säule der OOP.
Alle objektorientierten Sprachen unterstützen dieses Konzept: scheinbar gleichartige Objekte können sich im Verhalten unterscheiden.

Die Polymorphie der Objektorientierten Programmierung ist eine Eigenschaft, die immer im Zusammenhang mit Vererbung auftritt.

  • Bedeutet, dass eine einzelne Variable für verschiedene Objekte verwandter Klassen (zu verschiedenen Zeitpunkten) in einem Programm verwendet werden kann.
  • Wenn die Variable mit der Punktnotation variable.methode() verwendet wird, um eine Methode aufzurufen, hängt es vom Objekt ab, auf das die Variable gegenwärtig verweist, welche Methode tatsächlich ausgeführt wird.

Das ganze wird mit virtuellen Methoden der Basisklassen realisiert. Durch diese Methoden wird es erst möglich das „Kindklassen“ mit gleichen Methoden wie die virtuellen Methoden der Basisklassen, diese dann zur Laufzeit des Programms zu überschreiben.

Bespielsweise kann in einer Basisklasse TFigur eine Methode TFigur.MaßeBerechnen existieren. Diese Methode kann von einer Kindklasse TDreieck überschrieben werden, da jetzt die Maße eines Dreiecks berechnet werden sollen.

Vererbung

In der Objektorientierung ist Vererbung eine Vorgehensweise, neue Konstrukte (Klassen bzw. Prototypen) unter 
Verwendung von bestehenden hierarchisch aufzubauen.

Prinzip

Die Definition einer neuen Klasse kann gegebenenfalls auf der Definition einer bereits vorhandenen Klasse aufbauen, so dass die neue Klasse die Merkmale der vorhandenen übernimmt und um neue Bestandteile ergänzt. Die Übernahme der Merkmale der vorhandenen Klasse bezeichnet man als Vererbung.
Bei der Vererbung ist zwischen Schnittstellenvererbung und Implementationsvererbung zu unterscheiden. Bei der Schnittstellenvererbung erbt eine abgeleitete Klasse die Signaturen von Methoden, muss die Methoden aber selbst implementieren. Bei der Implementationsvererbung erbt die abgeleitete Klasse auch die Implementierung von einer oder mehreren Basisklassen bzw. die Implementierung des Prototypen.
Überdeckt ein neues Merkmal ein bei der Vererbung übernommenes Merkmal, dann spricht man von Überschreiben.
Die Nutzung der Vererbung bietet sich an, wenn es Klassen gibt, die konzeptionell aufeinander aufbauen. Gegebenenfalls lassen sich Klassendefinitionen von vorneherein so aufteilen, dass identische Merkmale in der Definition einer vererbenden Klasse zusammengefasst werden.

Beispiel: Schnittstellenvererbung

Ein Fahrzeug besitzt bestimmte Attribute, diese können z.B. Höchstgeschwindigkeit, maximale Zuladung oder auch Farbe sein. Die Klasse Kraftfahrzeug erbt all diese Attribute, kann aber noch zusätzliche Attribute besitzen, z.B. Leistung oder Drehmoment. Des Weiteren kann ein Kraftfahrzeug auch zusätzliche Methoden wie Beschleunigen besitzen, welche die Basisklasse Fahrzeug nicht kennt.
Die Klasse Personenkraftwagen kann dann wiederum von Kraftfahrzeug abgeleitet werden und weitere zusätzliche Attribute wie Anzahl der Sitze besitzen. Durch die Ableitung von Kraftfahrzeug erbt der Personenkraftwagen automatisch alle Attribute von Fahrzeug.
Ob eine Klasse in einer Vererbungsbeziehung zu einer anderen Klasse steht, lässt sich durch eine einfache Ist-Ein-Regel feststellen. Sobald die Aussage (Objekt der abgeleiteten Klasse) ist ein (Objekt der Basisklasse) zutrifft, stehen beide Klassen in einer Vererbungsbeziehung.

Ein Personenkraftwagen ist ein Kraftfahrzeug,Ein Personenkraftwagen ist ein Fahrzeug, aber
Ein Fahrzeug ist kein Personenkraftwagen.
Ein Personenkraftwagen ist kein Sitz
Ein Personenkraftwagen hat einen Sitz.
Schnittstellenvrerbung.jpg

Beispiel: Mehrfachvererbung

Von Mehrfachvererbung – im Unterschied zur Mehrstufigen Vererbung – spricht man, wenn eine Klasse von mehreren Klassen unmittelbar erbt.
Ein Anwendungsbeispiel hierfür ist die Modellierung eines Amphibienfahrzeugs, das sowohl die Attribute von Landfahrzeug als auch die von Wasserfahrzeug erbt. Damit besitzt Amphibienfahrzeug sowohl eine Räderzahl als auch einen Tiefgang.
Mehrfachvererbung