Klassendiagramm
Klassendiagramme beschreiben in der Informatik Objekt-Klassen durch Angaben der
- Operationen (Methoden/Funktionen),
- Zustände (Attribute) und,
- Beziehungen (Assoziationen / Relationen) zwischen den Klassen.
Klassen und Objekte
Klassen und Objekte sind die Grundlagen der objektorientierten Softwareentwicklung.
- Definition
- Klasse: Eine Klasse ist eine Definition der Attribute, Operationen und der Semantik für eine Menge von Objekten. Alle Objekte einer Klasse entsprechen dieser Definition.
- Definition
- Objekt: Ein Objekt ist eine im laufenden Betrieb konkret vorhandene und agierende Einheit. Jedes Objekt ist ein Exemplar einer Klasse. Ein Objekt enthält durch Attribute repräsentierte Informationen, deren Struktur in der Klasse definiert ist. Ein Objekt kann die in der Klasse definierten Nachrichten empfangen, es besitzt für jede definierte Nachricht entsprechende Operationen. Das durch Nachrichten definierte Verhalten gilt für alle Objekte einer Klasse gleichermaßen, ebenso die Struktur ihrer Attribute. Die Werte der Attribute sind jedoch für jedes Objekt individuell.
Der Begriff Klasse stammt von dem englischen Wort class und sollte im Sinne von Typklassifizierung verstanden werden. Eine Klasse legt fest, von welchem Typ ein Objekt ist. Sie enthält die Beschreibung der Struktur und des Verhaltens von Objekten, die mit ihr erzeugt werden können. In der objektorientierten Programmierung spricht man davon, dass die Objekte Instanzen einer Klasse sind. Die Definition einer Klasse setzt sich aus Attributen und Operationen zusammen. Das Verhalten eines Objektes wird beschrieben durch die möglichen Nachrichten, die es verstehen kann. Zu jeder Nachricht benötigt das Objekt entsprechende Operationen. Nachrichten und Operationen werden häufig synonym verwendet. Neben den Attributen und Operationen beinhaltet eine Klasse auch die Definition eventueller Zusicherungen und Eigenschaften.
Notation
Es gibt diverse Möglichkeiten, Klassen und ihre Eigenschaften grafisch zu notieren. In diesem Artikel wird speziell die Notation mittels der Unified Modeling Language (UML) vorgestellt.
Klassen
Klassen werden hier durch Rechtecke dargestellt, die entweder nur den Namen der Klasse (fett gedruckt) tragen oder zusätzlich auch Attribute, Operationen und Eigenschaften. Dabei werden diese vier Rubriken – Klassenname, Attribute, Operationen und Eigenschaften – jeweils durch eine horizontale Linie getrennt. Wenn die Klasse keine Eigenschaften oder Operationen besitzt, kann die unterste horizontale Linie entfallen. Klassennamen beginnen mit einem Großbuchstaben und sind Substantive im Singular (Sammelklassen ggf. im Plural). In der obersten Rubrik (Klassenname) können oberhalb des Klassennamens in doppelt spitzen Klammern die Klassen-Stereotypen und unterhalb des Klassennamens in geschweiften Klammern die Eigenschaften (z. B. {abstrakt}
) stehen. Dem Klassennamen kann der Name eines Paketes vorangestellt werden, wobei zwei Doppelpunkte den Paket- und Klassennamen trennen.
Attribute
Attribute (auch Eigenschaften oder Instanzvariablen) können neben ihrem Namen zusätzlich Angaben zu ihrer Sichtbarkeit, ihrem Typ (d. h. ihrer Klasse), einen Initialwert und Zusicherungen enthalten.
Attribut-Typ
Der Typ des Attributs ist in der Regel eine Klasse. Unter Java und C++ kann der Typ aber auch ein primitiver Datentyp, wie beispielsweise int
oder float
, sein. Der Attribut-Typ wird, durch einen Doppelpunkt getrennt, hinter den Namen des Attributs geschrieben.
Zusicherungen
Durch Zusicherungen kann der Wertebereich der Attribute eingeschränkt werden. So ist es möglich, einen gültigen Bereich oder eine Aufzählung gültiger Werte in geschweiften Klammern hinter das Attribut zu schreiben.
Initialwert
Mit Hilfe eines Initialwertes kann sichergestellt werden, dass, wenn eine Instanz einer Klasse gebildet wird, den Attributen automatisch sinnvolle Werte zugewiesen werden. Diese Initialwerte können nach dem Erzeugen eines Objektes verändert werden.
Operationen
Operationen werden auch als Methoden oder Funktionen bezeichnet. Sie besitzen einen Namen und ein Paar runde Klammern, innerhalb dieser Parameter angegeben werden können. Falls die Operation einen Rückgabewert besitzt, kann dieser, mit einem Doppelpunkt getrennt, hinter den Klammern angegeben werden. Ebenso wie bei den Attributen ist es möglich, die Sichtbarkeit der Operationen durch ein + oder ein - anzugeben.
Parameter
Operationen können mehrere Parameter übergeben werden. Die Parameter werden durch ihren Typ, einen Doppelpunkt und ihren Namen angegeben und in runde Klammern hinter die Operation geschrieben. Wenn mehrere Parameter angegeben werden, werden sie durch Kommata getrennt.
Objekte
Objekte sind die Instanz einer Klasse. Diese Beziehung wird durch einen gestrichelten Pfeil dargestellt. Um zu verdeutlichen, dass es sich um eine Instanziierung handelt, kann der Pfeil mit <<instance of>>
beschriftet werden.
Objekte besitzen einen Exemplarnamen und einen Klassennamen, welcher angibt, von welchem Typ das Objekt ist. Der Klassenname wird durch einen Doppelpunkt getrennt hinter den Exemplarnamen geschrieben. Zusätzlich zur Bezeichnung des Objektes können die Werte der Attribute mit in das Objekt geschrieben werden.
Vererbung, abstrakte Klassen und Schnittstellen
Vererbung
In der objektorientierten Softwareentwicklung können Klassen Eigenschaften von anderen Klassen erben. Wenn eine Klasse von einer Basisklasse geerbt hat, spricht man davon, dass sie von der Basisklasse abgeleitet ist. Abgeleitete Klassen besitzen alle Operationen und Attribute der Basisklasse, können aber auch zusätzliche Eigenschaften haben. Deshalb wird in diesem Zusammenhang oft von einer Spezialisierung gesprochen. Abgeleitete Klassen können Operationen von Basisklassen überschreiben. Das bedeutet, dass die abgeleitete Klasse die interne Funktion der Operation neu definieren kann. Wird dies nicht getan, entspricht die Operation automatisch der der Basisklasse. In der Programmiersprache Java kann eine Klasse nur von einer Basisklasse abgeleitet werden. Die Programmiersprache C++ unterstützt die Mehrfachvererbung. Das bedeutet, dass eine Klasse von mehreren Basisklassen abgeleitet sein kann. Dies wird jedoch in der Praxis in den seltensten Fällen benötigt.
Notation
Die Vererbungsbeziehung wird durch einen durchgezogenen Pfeil dargestellt. Die Pfeilspitze ist ein Dreieck, welches nicht ausgefüllt ist. Die abgeleiteten Klassen können entweder direkt auf die Basisklasse zeigen, oder es können mehrere Vererbungslinien zu einem Pfeil zusammen gefasst werden. Um zu verdeutlichen, dass durch die Vererbung die Funktionalität einer abgeleiteten Klasse durch die der Basisklasse erweitert wird, kann der Pfeil mit <<extend>>
beschriftet werden.
Abstrakte Klassen
Abstrakte Klassen sind Klassen, die abstrakte Methoden enthalten. Abstrakte Methoden haben lediglich eine Signatur, aber keine Implementierung. In abgeleiteten Klassen müssen diese Operationen überschrieben werden.
Abstrakte Klassen können nicht instanziiert werden. Lediglich von den abgeleiteten Klassen, die alle abstrakte Methoden überschrieben haben, können Objekte gebildet werden.
Mit Hilfe von abstrakten Klassen kann die Funktionalität abgeleiteter Klassen vorgeschrieben werden, ohne dass die Implementierung bereits festgelegt wird. Damit Instanzen der Klasse gebildet werden können, müssen die abstrakten Methoden irgendwo in der Klassenhierarchie überschrieben worden sein.
Notation
Abstrakte Klassen sehen in UML wie normale Klassen aus. Um sie zu unterscheiden, steht oberhalb des Klassennamens das Wort <<abstract>>
in doppelt spitzen Klammern. Alternativ kann der Klassenname auch kursiv geschrieben werden, wenn dies gut erkennbar ist.
Schnittstellen
Schnittstellen werden auch als Schnittstellenklassen oder im englischen als interface oder interface classes bezeichnet. Sie schreiben vor, welche Attribute und Operationen eine Klasse zur Verfügung stellen muss. Die Funktionsweise ist ähnlich der von abstrakten Klassen. Schnittstellen besitzen ausschließlich abstrakte Methoden, so dass die abgeleiteten Klassen alle Methoden überschreiben müssen. Man sagt in diesem Zusammenhang, dass eine Klasse eine Schnittstelle implementiert.
Objekte, die Instanzen einer Klasse sind, welche eine Schnittstelle implementiert, sind vom Typ der Schnittstelle. Das bedeutet, dass sie alle Eigenschaften der Schnittstelle zur Verfügung stellt. Dadurch sind Klassen, die dieselbe Schnittstelle implementieren, gegeneinander austauschbar.
Obwohl eine Klasse unter Java nur von einer Basisklasse abgeleitet werden kann, können von ihr mehrere Schnittstellen implementiert werden.
Notation
Schnittstellen werden in UML ebenfalls wie eine Klasse dargestellt. Sie besitzen oberhalb des Namens die Bezeichnung <<interface>>
in doppelt spitzen Klammern. Die Operationen müssen nicht als abstrakt gekennzeichnet werden, da Schnittstellen sowieso nur abstrakte Operationen enthalten.
Die Beziehung zwischen Schnittstellen und Klassen, die diese Schnittstelle implementieren, wird durch einen gestrichelten Pfeil dargestellt, der als Pfeilspitze ein nicht ausgefülltes Dreieck enthält. Der Pfeil zeigt hierbei von der implementierenden Klasse auf die Schnittstelle. Nach UML kann dieser Pfeil mit <<realize>>
bezeichnet werden.
Beziehungselemente
Beziehungselemente stellen die Beziehungen und Abhängigkeiten zwischen Klassen dar. Wie die Beziehungen zwischen Basisklassen und abgeleiteten Klassen in UML dargestellt werden, wurde im vorigen Absatz bereits erklärt. Ebenso wurde erklärt, wie die Implementierung von Schnittstellen dargestellt wird. In diesem Absatz werden weitere Beziehungselemente zwischen Klassen dargestellt.
Assoziation
Eine Assoziation beschreibt eine Beziehung zwischen zwei Klassen. Die konkrete Beziehung zwischen zwei Objekten dieser Klassen wird als Objektbeziehung bezeichnet. Objektbeziehungen sind Instanzen einer Assoziation. Mithilfe einer gerichteten Assoziation kann dargestellt werden, dass diese Beziehung nur in einer Richtung existiert. Dafür muss die Assoziation als Pfeil gezeichnet werden. Es besteht die Möglichkeit, an beide Seiten der Assoziation eine Multiplizität zu schreiben. Diese Zahl gibt an, mit wievielen Objekten der gegenüberliegenden Klasse ein Objekt assoziiert sein kann. Wenn diese Zahl variabel ist, wird der Bereich beispielsweise mit 1..5
angegeben. Liegt das Minimum bei 0
, bedeutet das, dass die Beziehung optional ist.
Aggregation
Die Aggregation ist eine Sonderform der Assoziation. Sie drückt aus, dass es sich nicht um zwei gleichwertige Elemente handelt. Vielmehr ist eines der Elemente ein Bestandteil des anderen. Anstelle des Wortes Aggregation wird häufig die Bezeichnung Teil-Ganzes-Beziehung verwendet.
Komposition
Die Komposition ist wiederum eine Sonderform der Aggregation. Sie drückt aus, dass die Teile von der Existenz des Ganzen abhängig sind. Eine Komposition hat in der Programmierung zur Folge, dass das Teil nicht erzeugt werden kann, wenn das Ganze noch nicht existiert. Auf der anderen Seite müssen, sobald das Ganze zerstört wird (z. B. in C++ durch einen delete Aufruf), auch alle Teile mit zerstört werden. Ein Beispiel dafür ist das Beenden eines Anwendungsprogramms. Wenn das Hauptprogramm beendet wird, müssen alle Unterprogramme mit beendet und alle allozierten Speicherbereiche wieder freigegeben werden.