Modellierung mit UML - Teil 2: Konzepte

Klassen, abstrakte Klassen und Objekte

Eine Klasse in der objektorientierten Modellierung und Programmierung ist eine Abstraktion. Wie bei den abstrakten Datentypen umfasst eine Klasse sowohl Struktur als auch Verhalten. Anders als bei abstrakten Datentypen können Klassen auch durch andere Klassen definiert werden. Angenommen wir haben eine Uhr, die auch als Taschenrechner benutzt werden kann. Dann kann die Klasse RechnerUhr als Verfeinerung der Klasse Uhr aufgefasst werden. Diese Art von Beziehung zwischen einer Basisklasse und einer verfeinerten Klasse wird Vererbung genannt. Die verallgemeinerte Klasse heißt Superklasse, die spezialisierte Klasse ist die Unterklasse. Bei einer Vererbungsbeziehung verfeinert die Unterklasse die Superklasse, indem neue Attribute und Operationen definiert werden. Im Bild definiert RechnerUhr eine Funktion zur Ausführung einfacher Arithmetik, die die Klasse Uhr nicht hat.

Wenn eine Vererbungsbeziehung ausschließlich dem Zweck dient, gemeinsame Attribute und Operationen zu modellieren, d.h. wenn eine Verallgemeinerung nie instantiiert wird, ist diese Klasse eine abstrakte Klasse. Abstrakte Klassen verkörpern oft verallgemeinerte Konzepte im Anwendungsbereich. Ihre Namen werden durch Kursivschrift dargestellt.

Zum Beispiel können in der Chemie Benzene als Klasse von Molekülen, die zur abstrakten Klasse OrganischeVerbindung gehören, aufgefasst werden. Man beachte, dass OrganischeVerbindung eine Verallgemeinerung ist und nicht einem Molekül entspricht, was besagt, dass OrganischeVerbindung keine Instanzen hat. In Java ist Collection eine abstrakte Klasse, für die es keine Instanzen gibt. Vielmehr sind alle Collection-Objekte Instanzen einer der Unterklassen von Collection, wie beispielsweise LinkedList, ArrayList oder HashMap. Man beachte, dass nicht alle Verallgemeinerungen abstrakte Klassen sind. Zum Beispiel ist die Uhr-Klasse im vorherigen Bild keine abstrakte Klasse, da sie selbst Instanzen haben kann. Wenn man Softwaresysteme modelliert, beziehen sich abstrakte Klassen manchmal auf keines der vorhandenen Konzepte des Anwendungsbereichs, sondern werden vielmehr eingeführt, um die Komplexität des Modells zu reduzieren oder seine Wiederverwendbarkeit zu vereinfachen.

Eine Klasse definiert die Operationen, die auf ihre Instanzen angewendet werden können. Operationen einer Superklasse können auch auf die Objekte der Unterklasse vererbt und angewendet werden. In Darstellung 8 ist die Operation setzeDatum(d), die das aktuelle Datum einer Uhr einstellt, auch für RechnerUhren verfügbar. Die in der RechnerUhr-Klasse definierte Operation setzeRechnerModus steht aber für die Uhr-Klasse nicht zur Verfügung.

Eine Klasse definiert die Attribute, die in all ihren Instanzen vorhanden sind. Ein Attribut ist eine bezeichnete Zelle in der Instanz, in der ein Wert gespeichert ist. Attribute haben eindeutige Namen innerhalb der Klasse und eines Typs. Die Klasse Uhr hat ein Zeit- und ein Datum-Attribut. Die Klasse RechnerUhr hat ein RechnerZustand-Attribut. Ein Objekt ist eine Instanz einer Klasse. Ein Objekt hat eine Identität und speichert Attributwerte. Jedes Objekt gehört zu genau einer Klasse. In UML wird eine Instanz durch ein Rechteck mit einem unterstrichenen Namen veranschaulicht. Diese Konvention wird in UML benutzt, um zwischen Instanzen und Klassen zu unterscheiden.

Im Bild 10 ist einfacheUhr1291 eine Instanz von Uhr und RechnerUhr1515 eine Instanz von Rechner-Uhr. Obwohl die Operationen von Uhr für RechnerUhr1515 verfügbar sind, ist RechnerUhr-1515 keine Instanz der Klasse Uhr. Die Attribute eines Objekts können bei einigen Programmiersprachen für andere Teile des Systems sichtbar sein. Zum Beispiel gestattet Java dem Programmierer zu spezifizieren, welche Attribute sichtbar sein sollen und welche nicht.