Übungsaufgaben zum UML-Klassendiagramm

https://bildung.social/@oerinformatik/

https://oer-informatik.de/uml-klassendiagramm-uebungsaufgaben

UML-Klassendiagramm, Kapselung, Sichtbarkeit, Klassenattribut, Überladung, Abstrakte Klasse, Interface, Aggregation, Komposition, Übungsaufgaben

tl/dr; (Bearbeitungszeit insgesamt 122 min, mehrere Aufgaben): Fünf Übungsaufgaben zum UML-Klassendiagramm: zum Einstieg ein Klassendiagramm lesen, eine Methodendeklaration zerlegen, Klassen ergänzen und gewählte Datentypen nach Speicherbedarf beurteilen; danach eine Klasse aus Anforderungen mit Sichtbarkeiten, Datentypen, Konstruktor, Getter und Setter erstellen, ein Klassendiagramm aus Quellcode und einem englischen Text ableiten und Fehler in einer Vorgabe korrigieren sowie ein Modell mit mehreren Klassen, Vererbung und Beziehungen zeichnen. Alle Lösungen sind ausgeblendet und mit Punkteverteilung versehen [AI-Assisted]. (Zuletzt geändert am 29.10.2026)

Dieser Artikel ist Teil einer Artikelreihe über UML-Klassendiagramme: Einstieg in das Klassendiagramm (Übung Ticketautomat, Übungsaufgaben) / Sichtbarkeitsmodifikatoren / Assoziation, Aggregation, Komposition (Übungsaufgaben) / Vererbung (Übungsaufgaben) / Abstrakte Klassen und Interfaces / Polymorphie (Übungsaufgaben). Dazu: Klassendiagramme mit PlantUML zeichnen und Objektdiagramm.

Diese Übungsaufgaben gehören zu den Artikeln Einstieg in objektorientierte Programmierung mit dem UML-Klassendiagramm und UML-Klassendiagramm: Sichtbarkeitsmodifikatoren. Einzelne Teilaufgaben greifen schon auf Objektbeziehungen, Vererbung sowie abstrakte Klassen und Interfaces vor.

Wortwolke zu den Übungsaufgaben: UML-Klassendiagramm, Klasse, Attribut, Methode, Kapselung, Sichtbarkeit, Konstruktor, Klassenattribut, Interface, abstrakte Klasse (mit KI erstellt)

Hinweise zur Bearbeitung: Bis zur Teil-1-Prüfung der IT-Berufe solltest Du die Basiskompetenz beherrschen, also Aufgabe 1.1 und Aufgabe 1.2. Als FIA, FISY, FIDV oder IKS musst Du zur Teil-2-Prüfung Aufgaben auf Kernkompetenz-Ebene lösen können, das sind Aufgabe 2.1, Aufgabe 2.2 und Aufgabe 2.3. Zeichne Deine Diagramme auf Papier oder mit einem Werkzeug Deiner Wahl, bevor Du die Beispiellösung aufklappst. Als Datentypen nutzt die Beispiellösung die UML-Typen Integer, Real, Boolean und String; Typen aus Programmiersprachen (int, double, boolean, float …) sind ebenso richtig, wenn sie passen. Methoden ohne Rückgabewert dürfen auch mit : void notiert werden. Pseudocode muss keiner bestimmten Sprache folgen, aber eindeutig sein.

Notationsübersicht

Diese Notationsübersicht kannst Du bei allen Aufgaben nutzen.

Notationsübersicht Klassendiagramm: Klasse mit Attributen und Methoden, abstrakte Klasse, Interface und Syntax der Einträge (mit KI erstellt)
Notationsübersicht Klassendiagramm: Beziehungen Vererbung, Implementierung, Assoziation, gerichtete Assoziation, Aggregation und Komposition (mit KI erstellt)

Du möchtest eigene Aufgaben zum Üben von einem KI-Sprachmodell generieren lassen?

Kopiere den Text in ein KI-Sprachmodell Deiner Wahl und passe Kompetenzstufe, Anzahl, Bearbeitungszeit und Szenario bei Bedarf an. Wie die Aufgaben aufgebaut sind, beschreibt der Artikel Wie sind die Aufgaben aufgebaut?. Prüfe die Ergebnisse mit dem Lehrartikel: KI-Sprachmodelle machen Fehler.

Erstelle neue Übungsaufgaben zum Thema „UML-Klassendiagramm“.

Bauplan: Halte Dich an Aufbau, Kompetenzstufen, Operatoren,
Anforderungsbereiche, Punkte und Zeitschätzung, die im Artikel
https://oer-informatik.de/aufgaben-aufbau beschrieben sind.

Fachliche Grundlage:
- https://oer-informatik.de/uml-klassendiagramm
- https://oer-informatik.de/uml-klassendiagramm-sichtbarkeitsmodifikatoren
- https://oer-informatik.de/uml-klassendiagramm-assoziation
- https://oer-informatik.de/uml-klassendiagramm-vererbung
- https://oer-informatik.de/uml-klassendiagramm-interface-abstraktion
- Stilbeispiel: https://oer-informatik.de/uml-klassendiagramm-uebungsaufgaben

Die Aufgaben sollen Inhalte zu diesen Schlagwörtern abdecken:
- UML-Klassendiagramm
- Kapselung
- Sichtbarkeit
- Klassenattribut
- Überladung
- Abstrakte Klasse
- Interface
- Aggregation
- Komposition

Kompetenzstufe: Kernkompetenz (alternativ: Basiskompetenz, Profilkompetenz, Expertise)
Anzahl: 1 Aufgabe mit Teilaufgaben
Bearbeitungszeit in Minuten ca.: <5 bis 30 min>
Szenario: eines der Szenarien aus dem Bauplan

Vorgehen:
1. Lies zuerst die verlinkten Artikel. Kannst Du keine Webseiten
   abrufen, sag mir das, statt zu raten.
2. Steht bei einer Angabe noch ein Platzhalter in <…>, frag mich
   zuerst danach. Richte Punkte und Zahl der Teilaufgaben nach der
   Bearbeitungszeit (ca. 0,9 min je Punkt).
3. Gib je Aufgabe Titel mit Kompetenzstufe, Ausgangssituation und
   Teilaufgaben mit Operator und Punktzahl aus, dazu die geschätzte
   Bearbeitungszeit.
4. Gib die Beispiellösungen mit Punkteverteilung erst aus, wenn ich
   danach frage.

Aufgabe 1.1: Eine Klasse der Freizeit-App lesen (Basiskompetenz)

(ca. 14 min Bearbeitungszeit)

Bei der Let’s Meet GmbH arbeitest Du mit Jonas Weber am Backend der Freizeit-App. Yusuf Demir zeigt Euch die Klasse Aktivitaet, die alle Aktivitäten der App verwaltet.

Klasse Aktivitaet mit dem Klassenattribut anzahl, den privaten Attributen aktivitaetId, titel, mindestalter (Startwert 16) und maxTeilnehmende, einem Konstruktor sowie den Methoden getTitel, anmelden und absagen (mit KI erstellt)

a) Kreuze die zutreffenden Aussagen zum Klassendiagramm an. (3 Punkte)

Aussagen zur Klasse Aktivitaet
Nr. Aussage zutreffend (ja/nein)
1 Die Klasse heißt Aktivitaet.
2 Das Attribut titel kann von anderen Klassen direkt geändert werden.
3 Die Methode anmelden ist öffentlich und gibt einen Wahrheitswert zurück.
4 Aktivitaet(titel: String, maxTeilnehmende: Integer) ist ein Konstruktor; er hat keinen Rückgabetyp.
5 Jedes Objekt der Klasse hat seinen eigenen Wert für anzahl.
6 Wird nichts anderes angegeben, hat eine neue Aktivität das Mindestalter 16.

Zutreffend sind 1, 3, 4 und 6. Je richtig beurteilter Aussage 0,5 Punkte.

  • 2 trifft nicht zu: titel ist privat (-) und nur innerhalb der Klasse sichtbar; andere Klassen können ihn höchstens über eine Methode lesen (getTitel()).

  • 5 trifft nicht zu: anzahl ist unterstrichen, also ein Klassenattribut (statisch). Es gibt den Wert nur einmal für die ganze Klasse, z. B. um die Zahl der angelegten Aktivitäten zu zählen.

b) Ein Klassensymbol ist in drei Bereiche gegliedert. Gib an, welche Angaben in den drei Bereichen stehen. (3 Punkte)

Je 1 Punkt:

  1. oben: der Name der Klasse (Aktivitaet),

  2. Mitte: die Attribute (Eigenschaften) mit Sichtbarkeit, Datentyp und ggf. Startwert,

  3. unten: die Operationen (Methoden) einschließlich Konstruktor mit Parametern und Rückgabetyp.

c) Benenne die fünf Bestandteile der Methodendeklaration +anmelden(person: Benutzer): Boolean. (5 Punkte)

Bestandteile einer Methodendeklaration
Nr. Bestandteil Bezeichnung
1 +
2 anmelden
3 person
4 Benutzer (hinter person:)
5 Boolean (hinter der Klammer)

Je 1 Punkt:

Bestandteile einer Methodendeklaration (Beispiellösung)
Nr. Bestandteil Bezeichnung
1 + Sichtbarkeit: öffentlich (public)
2 anmelden Name (Bezeichner) der Methode
3 person Name des Übergabeparameters
4 Benutzer Datentyp des Parameters (hier eine Klasse)
5 Boolean Rückgabetyp (Wahrheitswert)

d) Jonas hat bisher nur prozedural programmiert. Ordne die Tätigkeiten der prozeduralen (P) oder der objektorientierten (O) Softwareentwicklung zu. (2 Punkte)

Tätigkeiten der Softwareentwicklung
Tätigkeit P oder O
Für gleichartige Dinge (alle Aktivitäten) wird ein Bauplan mit Eigenschaften und Methoden festgelegt.
Das Programm wird in eine Folge von Funktionen zerlegt, die Daten als Parameter erhalten.
Eine neue Klasse übernimmt die Eigenschaften einer vorhandenen Klasse und ergänzt sie (Vererbung).
Daten und die Funktionen, die sie bearbeiten, werden getrennt voneinander verwaltet.

O, P, O, P (je 0,5 Punkte).

e) Nenne zwei Vorteile der objektorientierten gegenüber der prozeduralen Programmierung. (2 Punkte)

Je 1 Punkt, z. B.:

  • Wiederverwendbarkeit: Klassen (auch aus Klassenbibliotheken) lassen sich in anderen Programmen nutzen und per Vererbung erweitern.

  • Kapselung: Daten sind vor unkontrolliertem Zugriff geschützt; Änderungen im Inneren einer Klasse wirken sich nicht auf andere Programmteile aus.

  • Wartbarkeit und Übersicht: Die Struktur des Programms entspricht den Dingen der Wirklichkeit (Aktivität, Benutzer, Treffpunkt), Fehler lassen sich leichter eingrenzen.

  • Erweiterbarkeit: Neue Arten (z. B. eine spezielle Wanderung) können als Unterklasse ergänzt werden, ohne vorhandenen Code zu ändern.

Aufgabe 1.2: Den Kostenbeitrag in der Mitfahr-App berechnen (Basiskompetenz)

(ca. 15 min Bearbeitungszeit)

In der Mitfahr-App „RatzFahrt“ des Ratz und Rübe Berufskollegs dürfen Fahrer*innen höchstens 0,10 € je Kilometer und mitfahrender Person verlangen. Oksana Melnyk entwickelt dafür eine Klasse, von der bisher nur die Methode berechneHoechstbeitrag() festgelegt ist.

Unvollständiges Klassensymbol: Klassenname und Attribute fehlen, eingetragen ist nur die Methode berechneHoechstbeitrag mit dem Rückgabetyp Real (mit KI erstellt)

a) Die Klasse soll Kostenrechner heißen und folgende Attribute besitzen, die nur innerhalb der Klasse sichtbar sein dürfen:

  • obergrenzeJeKm: höchster Beitrag je Kilometer und Person in Euro (Dezimalzahl),

  • streckeKm: Länge der Fahrt in Kilometern (Dezimalzahl),

  • anzahlMitfahrende: Zahl der mitfahrenden Personen (ganze Zahl),

  • probezeit: gibt an, ob die fahrende Person noch in der Probezeit ist (ja/nein).

Ergänze das Klassendiagramm um den Klassennamen und die Attribute mit Sichtbarkeit und Datentyp. (5 Punkte)

b) Die Klasse soll eine weitere Methode pruefeBeitrag erhalten, die von anderen Klassen aufgerufen werden kann. Sie übernimmt einen Betrag in Euro und gibt zurück, ob dieser Betrag zulässig ist. Trage die Methode in das Klassendiagramm ein. (3 Punkte)

Klasse Kostenrechner mit vier privaten Attributen und den öffentlichen Methoden berechneHoechstbeitrag und pruefeBeitrag (Beispiellösung) (mit KI erstellt)

Bewertung a): Klassenname 1 Punkt, je Attribut mit - und passendem Datentyp 1 Punkt. Programmiersprachen-Typen (double, int, boolean) sind ebenso richtig.

Bewertung b): Sichtbarkeit + 1 Punkt, Parameter mit Datentyp 1 Punkt, Rückgabetyp Boolean 1 Punkt.

c) Für eine Auswertung am Schuljahresende legt Oksana die Klasse Fahrerprofil an. Die Profile aller Fahrer*innen werden auf dem Schulserver gespeichert; jedes Profil soll so wenig Speicher wie möglich belegen. Projektleiter Thomas Becker hat Zweifel an einigen der Datentypen, die Oksana gewählt hat. Beurteile jede Wahl: Ist sie passend? Wenn nicht, gib den besseren Typ an und begründe kurz. Die Tabelle der Java-Typen hilft Dir dabei. (5 Punkte)

Einige Datentypen in Java
Typ Größe darstellbare Werte
boolean 1 Byte true, false
byte 1 Byte ganze Zahlen von −128 bis 127
short 2 Byte ganze Zahlen von −32.768 bis 32.767
int 4 Byte ganze Zahlen bis etwa ±2,1 Milliarden
long 8 Byte ganze Zahlen bis etwa ±9,2 Trillionen
float 4 Byte Gleitkommazahl, etwa 7 gültige Stellen
double 8 Byte Gleitkommazahl, etwa 15 gültige Stellen
String je nach Länge beliebige Zeichenkette
Datentypen der Klasse Fahrerprofil
Attribut Bedeutung Oksanas Wahl Urteil und ggf. besserer Typ mit Begründung
anzahlFahrten Fahrten, die die Person bisher angeboten hat (höchstens einige Tausend) byte
plzWohnort fünfstellige Postleitzahl, z. B. 33602 oder 01067 int
abfahrtMinute übliche Abfahrtszeit als Minute des Tages (0 bis 1439) int
bewertung Durchschnitt der Bewertungen durch Mitfahrende, 1,0 bis 5,0 mit einer Nachkommastelle double
meterImSchuljahr im Schuljahr gefahrene Strecke in Metern (bis etwa 3 Millionen) int

Je Zeile 1 Punkt (0,5 Punkte für das Urteil, 0,5 Punkte für Typ bzw. Begründung):

Datentypen der Klasse Fahrerprofil (Beispiellösung)
Attribut Urteil Begründung
anzahlFahrten ungeeignet, besser short byte reicht nur bis 127; einige Tausend passen in short (bis 32.767)
plzWohnort ungeeignet, besser String Mit Postleitzahlen wird nicht gerechnet; als Zahl ginge die führende Null von 01067 verloren
abfahrtMinute darstellbar, aber zu groß, besser short 1439 passt nicht in byte, wohl aber in short (2 statt 4 Byte)
bewertung darstellbar, aber zu groß, besser float zwei gültige Stellen reichen; float braucht 4 statt 8 Byte
meterImSchuljahr passend 3 Millionen sind größer als der Höchstwert von short; int ist der kleinste passende Typ, long wäre unnötig groß

Hinweis: Wer bei der Postleitzahl int mit der Begründung „geringerer Speicher als ein Text“ beibehält und die führende Null bei der Ausgabe ergänzt, erhält den Punkt ebenfalls.

d) Oksana hat alle Attribute als privat gekennzeichnet. Erläutere am Beispiel des Attributs obergrenzeJeKm, welchen Vorteil das hat. (3 Punkte)

Private Attribute sind nur innerhalb der Klasse sichtbar (Kapselung, 1 Punkt). Andere Klassen können obergrenzeJeKm nicht direkt ändern, sondern nur über Methoden der Klasse (1 Punkt). So kann die Klasse sicherstellen, dass die Obergrenze nie über 0,10 € gesetzt wird und keine ungültigen Werte (z. B. negative Beträge) entstehen; wird die interne Speicherung später geändert, bleiben die anderen Klassen davon unberührt (1 Punkt).

Aufgabe 2.1: Rahmenkonfiguration im Fahrradshop (Kernkompetenz)

(ca. 28 min Bearbeitungszeit)

Du bist Auszubildende*r im Entwicklungsteam der CSB-Rad GmbH in Bielefeld. Kund*innen können im Onlineshop einen Fahrradrahmen nach Maß konfigurieren, der dann beim Fertigungspartner Rahmenwerk OWL GmbH in Gütersloh gebaut wird. Der Konfigurator wird gerade objektorientiert neu entwickelt. Cem Sarıkaya, Geschäftsführer Technik und IT, hat die Anforderungen an die Klasse Rahmenkonfiguration zusammengestellt:

  • Jede Rahmenkonfiguration hat eine Konfigurationsnummer (ganze Zahl), eine Rahmenform, eine Rahmenhöhe in ganzen Zentimetern, einen RAL-Farbcode als Text (z. B. „RAL 5015“), eine Oberfläche, eine optionale Lasergravur (Text) und einen Grundpreis in Euro (Dezimalzahl).

  • Für Rahmenform und Oberfläche gibt es bereits die Aufzählungen Rahmenform (DIAMANT, TRAPEZ, TIEFEINSTEIGER, LASTENRAD_LONG_JOHN) und Oberflaeche (GLANZ, MATT, STRUKTURIERT). Wird keine Oberfläche gewählt, ist sie matt.

  • Sämtliche Attribute der Klasse sind privat.

  • Die Konfigurationsnummer wird beim Erzeugen automatisch fortlaufend vergeben. Dazu merkt sich die Klasse in einem für alle Objekte gemeinsamen Zähler naechsteNummer die nächste freie Nummer; die erste Nummer ist 1001. Eine ebenfalls öffentliche Methode anzahlKonfigurationen gibt zurück, wie viele Konfigurationen bisher erzeugt wurden – auch dann, wenn noch kein Objekt existiert.

  • Ein öffentlicher Konstruktor erhält Rahmenform, Rahmenhöhe und Farbcode.

  • Andere Klassen dürfen die Konfigurationsnummer auslesen. Ist sie einmal vergeben, darf sie niemand mehr ändern.

  • Die Rahmenhöhe lässt sich nachträglich anpassen, allerdings nur auf Werte von 40 bis 64 cm; die Methode dafür meldet zurück, ob der neue Wert übernommen wurde. Auslesen lässt sich die Höhe ebenfalls.

  • Eine andere Oberfläche kann jederzeit gesetzt werden, ausgelesen wird sie nicht. Der Text der Gravur ist dagegen von außen les- und schreibbar.

  • Die öffentliche Methode berechnePreis gibt den Gesamtpreis (Grundpreis plus Aufpreise für Oberfläche und Gravur) zurück.

  • Die Methode pruefeRalCode prüft, ob ein übergebener Text ein gültiger RAL-Code ist. Sie wird nur innerhalb der Klasse benötigt.

  • Die Methode uebertrageAnPartner erzeugt aus der Konfiguration den Fertigungsauftrag für Rahmenwerk OWL und gibt die Auftragsnummer als Text zurück. Sie darf nur von Klassen aufgerufen werden, die im selben Paket fertigung liegen.

a) Die Anforderungen setzen das Prinzip der Kapselung um. Nenne zwei Ziele, die mit Kapselung in der objektorientierten Programmierung erreicht werden. (4 Punkte)

Je Ziel 2 Punkte (1 Punkt Nennung, 1 Punkt kurze Konkretisierung), z. B.:

  • Daten und zugehörige Methoden in einer Einheit zusammenfassen: Zustand (Attribute) und Verhalten (Methoden) eines Objekts gehören zusammen und werden gemeinsam gepflegt.

  • Kontrollierter Zugriff über eine Schnittstelle (Geheimnisprinzip, information hiding): Andere Objekte erreichen die Daten nur über öffentliche Methoden. So kann z. B. der Setter für die Rahmenhöhe ungültige Werte abweisen; der Zustand bleibt immer gültig (konsistent).

  • Änderbarkeit/Wartbarkeit: Die innere Darstellung (z. B. Datentyp eines Attributs) kann geändert werden, ohne dass aufrufender Code angepasst werden muss.

  • Weniger Fehler durch Abhängigkeiten: Andere Klassen hängen nur von der öffentlichen Schnittstelle ab, nicht von Implementierungsdetails.

b) Erstelle das UML-Klassendiagramm der Klasse Rahmenkonfiguration. Gib alle Attribute und Methoden mit Sichtbarkeit und Datentypen an, außerdem den Konstruktor. Notiere Getter und Setter nur dort, wo die Anforderungen sie verlangen. Die beiden Aufzählungen musst Du nicht zeichnen. (12 Punkte)

Klassendiagramm der Klasse Rahmenkonfiguration (Beispiellösung) (mit KI erstellt)

Bewertung:

  • acht Attribute mit - und passendem Datentyp: je 0,5 Punkte (4 Punkte)

  • Konstruktor mit Klassennamen, drei typisierten Parametern und ohne Rückgabetyp: 1 Punkt

  • zehn Methoden mit Sichtbarkeit und vollständiger Signatur (getKonfigurationsnr, getRahmenhoehe, setRahmenhoehe mit Rückgabe Boolean, setOberflaeche, getGravur, setGravur, berechnePreis, pruefeRalCode mit -, uebertrageAnPartner mit ~, anzahlKonfigurationen): je 0,5 Punkte (5 Punkte)

  • naechsteNummer und anzahlKonfigurationen() als statisch gekennzeichnet (unterstrichen oder {static}): 1 Punkt

  • Startwerte = 1001 und = MATT: 1 Punkt

Hinweise:

  • Kein Setter für die Konfigurationsnummer – nach der Vergabe darf sie niemand mehr ändern. Ein setKonfigurationsnr gibt Abzug.

  • anzahlKonfigurationen() muss statisch sein, weil sie auch ohne Objekt aufrufbar sein soll.

  • Die Gravur ist optional: String [0..1] ist am genauesten, String allein ist ebenfalls richtig.

  • Als Typ für Rahmenform und Oberfläche werden die vorhandenen Aufzählungen verwendet, nicht String.

c) Implementiere in Pseudocode

  • den Konstruktor: Er vergibt die Konfigurationsnummer und erhöht den Zähler. Die Rahmenhöhe wird über den Setter gesetzt; ist sie ungültig, wird 52 cm verwendet. Der Farbcode wird nur übernommen, wenn er gültig ist, sonst wird „RAL 9005“ (Tiefschwarz) eingetragen. Den Grundpreis liefert die vorhandene Klassenmethode Preisliste.grundpreis(form: Rahmenform): Real.

  • die Methode zum Ändern der Rahmenhöhe.

(8 Punkte)

öffentlich Rahmenkonfiguration(form: Rahmenform, hoehe: Integer, farbcode: String)
    this.konfigurationsnr := naechsteNummer
    naechsteNummer := naechsteNummer + 1
    this.rahmenform := form
    wenn nicht setRahmenhoehe(hoehe) dann
        this.rahmenhoehe := 52
    ende wenn
    wenn pruefeRalCode(farbcode) dann
        this.ralFarbcode := farbcode
    sonst
        this.ralFarbcode := "RAL 9005"
    ende wenn
    this.grundpreis := Preisliste.grundpreis(form)
    // oberflaeche ist durch den Startwert bereits MATT
ende Konstruktor

öffentlich setRahmenhoehe(hoehe: Integer): Boolean
    wenn hoehe >= 40 und hoehe <= 64 dann
        this.rahmenhoehe := hoehe
        rückgabe wahr
    sonst
        rückgabe falsch
    ende wenn
ende Methode

Bewertung Konstruktor (5 Punkte): Methodenkopf ohne Rückgabetyp 1 Punkt, Nummer vergeben und Zähler erhöhen 1 Punkt, Höhe über Setter mit Ersatzwert 1 Punkt, Farbcode mit Prüfung 1 Punkt, Grundpreis über Klassenmethode und Form zuweisen 1 Punkt.

Bewertung Setter (3 Punkte): Methodenkopf mit Parameter und Rückgabetyp 1 Punkt, Bereichsprüfung 1 Punkt, Zuweisung und beide Rückgaben 1 Punkt.

Hinweis: Wer im Konstruktor die Höhe direkt zuweist, ohne zu prüfen, umgeht die Kapselung – dann kann ein ungültiger Zustand entstehen.

d) Ein Mit-Azubi fragt, was die vier Sichtbarkeiten im Klassendiagramm bedeuten. Fülle die Tabelle aus: Trage den Namen ein und kreuze an, von wo aus auf ein so gekennzeichnetes Attribut zugegriffen werden kann (Bedeutung nach UML). (4 Punkte)

Sichtbarkeiten im UML-Klassendiagramm (zum Ausfüllen)
Symbol Name eigene Klasse Unterklasse (auch in anderem Paket) andere Klasse im selben Paket beliebige andere Klasse
+
-
#
~
Sichtbarkeiten im UML-Klassendiagramm (Lösung)
Symbol Name eigene Klasse Unterklasse (auch in anderem Paket) andere Klasse im selben Paket beliebige andere Klasse
+ public (öffentlich) x x x x
- private (privat) x
# protected (geschützt) x x (x)
~ package (paketsichtbar) x nur, wenn im selben Paket x

Je richtig ausgefüllter Zeile 1 Punkt.

Zu #: Nach UML ist ein geschütztes Element nur für die eigene Klasse und für Unterklassen sichtbar. In Java sehen es zusätzlich alle Klassen im selben Paket – daher die Klammer. Beide Antworten sind richtig, wenn sie begründet sind.

e) Erläutere, warum naechsteNummer als Klassenattribut, rahmenhoehe dagegen als Instanzattribut modelliert wird. (3 Punkte)

  • Ein Instanzattribut gibt es in jedem Objekt einzeln; jede Konfiguration hat ihre eigene Rahmenhöhe (1 Punkt).

  • Ein Klassenattribut (statisch) gibt es nur einmal für die ganze Klasse; alle Objekte teilen sich den Wert. Nur so kann der Zähler wissen, welche Nummer als Nächstes frei ist – ein Zähler je Objekt würde bei jedem Objekt wieder mit 1001 beginnen (1 Punkt).

  • Weil der Zähler unabhängig von einem Objekt existiert, kann auch die statische Methode anzahlKonfigurationen() ohne Objekt auf ihn zugreifen (z. B. naechsteNummer - 1001); auf Instanzattribute wie rahmenhoehe hat sie dagegen keinen Zugriff (1 Punkt).

Aufgabe 2.2: Türschilder und Infomonitore beim Barcamp (Kernkompetenz)

(ca. 35 min Bearbeitungszeit)

Du gehörst als Auszubildende*r zum Orga-Team des Barcamps „Lernen.Digital.Leben 2027“ am Ratz und Rübe Berufskolleg in Bielefeld. Vor den acht Barcamp-Räumen hängen E-Ink-Türschilder, die per MQTT den aktuellen Sessionplan bekommen. Emre Aksoy (Azubi FISY, Leitung Technikteam) hat die Klasse Tuerschild bereits in Java programmiert, aber keine Dokumentation erstellt. Gesamtleiter Dimitrios Papadopoulos bittet Dich, das Klassenmodell nachzuziehen. Nutze die Notationsübersicht oben.

package barcamp.anzeige;

public class Tuerschild {
    public static final int MAX_ZEICHEN = 22;
    private static int anzahlSchilder = 0;

    private String raumnummer;
    private String mqttTopic;
    protected int akkustand;
    private String[] belegung = new String[5];   // ein Eintrag je Session-Slot
    private boolean online = false;

    public Tuerschild(String raumnummer) {
        this(raumnummer, "barcamp/raum/" + raumnummer);
    }

    public Tuerschild(String raumnummer, String mqttTopic) {
        this.raumnummer = raumnummer;
        this.mqttTopic = mqttTopic;
        anzahlSchilder++;
    }

    public String getRaumnummer() {
        return raumnummer;
    }

    public int getAkkustand() {
        return akkustand;
    }

    void setAkkustand(int prozent) {
        if (prozent >= 0 && prozent <= 100) {
            akkustand = prozent;
        }
    }

    public boolean isOnline() {
        return online;
    }

    public void aktualisiere(int slot, String titel) {
        belegung[slot] = kuerze(titel);
    }

    public int anzahlFreieSlots() {
        int frei = 0;
        for (String eintrag : belegung) {
            if (eintrag == null) {
                frei++;
            }
        }
        return frei;
    }

    private String kuerze(String text) {
        if (text.length() <= MAX_ZEICHEN) {
            return text;
        }
        return text.substring(0, MAX_ZEICHEN - 1) + "…";
    }

    public static int getAnzahlSchilder() {
        return anzahlSchilder;
    }
}

a) Erstelle aus dem Quelltext das UML-Klassendiagramm der Klasse Tuerschild mit allen Attributen und Methoden. (10 Punkte)

Klassendiagramm der Klasse Tuerschild, abgeleitet aus dem Quelltext (Beispiellösung) (mit KI erstellt)

Bewertung:

  • sieben Attribute mit Sichtbarkeit und Datentyp: je 0,5 Punkte (3,5 Punkte)

  • zehn Operationen (zwei Konstruktoren und acht Methoden) mit Sichtbarkeit und vollständiger Signatur: je 0,5 Punkte (5 Punkte)

  • #akkustand und ~setAkkustand(…) richtig erkannt (Java: protected bzw. kein Modifikator = Paketsichtbarkeit): 0,5 Punkte

  • MAX_ZEICHEN, anzahlSchilder und getAnzahlSchilder() als statisch gekennzeichnet, MAX_ZEICHEN zusätzlich als Konstante ({readOnly}, auch {final} wird akzeptiert): 1 Punkt

Hinweise:

  • Das Array belegung kann als String [5], String [0..*] oder String[] notiert werden.

  • Startwerte (= 22, = 0, = false) sind für die volle Punktzahl nicht nötig, aber richtig.

  • Der Rumpf der Methoden (z. B. die Prüfung in setAkkustand) erscheint im Klassendiagramm nicht.

b) Mia Schröder hat für die Sessionplanung die Klasse Session skizziert. Die Anforderungen lauten:

  • Titel und Raum sind privat; der Titel kann über Getter und Setter gelesen und geändert werden.

  • Der Slot (Nummer des Zeitfensters) ist privat.

  • Ein öffentlicher Konstruktor erhält Titel und Raum.

  • Die öffentliche Methode istVoll gibt zurück, ob alle Plätze vergeben sind.

  • Die öffentliche Methode buchen erhält eine Person und gibt zurück, ob die Buchung geklappt hat.

Session
--------------------------------------------
- titel
- raum : Raum
+ slot : int
--------------------------------------------
+ Session(titel : String) : void
+ getTitel(titel : String) : String
+ setTitel(titel : String) : String
+ istVoll : boolean
private buchen(p : Person) : boolean

Die Skizze enthält acht Fehler. Finde mindestens sieben davon und korrigiere sie, indem Du die fehlerhaften Zeilen richtig notierst. (7 Punkte)

Fehler in der Skizze der Klasse Session
Nr. fehlerhaft korrigiert Fehler
1 - titel -titel: String Datentyp fehlt
2 + slot : int -slot: Integer Slot soll privat sein
3 + Session(titel : String) : void +Session(titel: String, raum: Raum) Konstruktor hat keinen Rückgabetyp (auch nicht void) …
4 (ebenda) (ebenda) … und der Parameter raum fehlt
5 + getTitel(titel : String) : String +getTitel(): String Getter erhält keinen Parameter
6 + setTitel(titel : String) : String +setTitel(titel: String) Setter gibt nichts zurück (oder : void)
7 + istVoll : boolean +istVoll(): Boolean ohne Klammern wäre es ein Attribut
8 private buchen(p : Person) : boolean +buchen(p: Person): Boolean Methode soll öffentlich sein (im Diagramm steht dafür das Symbol +, nicht ein Wort)

Je gefundenem und richtig korrigiertem Fehler 1 Punkt, höchstens 7 Punkte. Die Fehler 3 und 4 stecken in derselben Zeile und zählen einzeln.

c) Die Türschilder nutzen für die Verbindung zum MQTT-Broker eine Klassenbibliothek. Ihre Dokumentation liegt nur auf Englisch vor:

Class MqttConnection – An object of this class represents one client session with an MQTT broker. The constructor takes the host name of the broker (text) and the port number (integer); it creates the object but does not connect yet. Host name and port are stored in private fields. Each connection has a client identifier (text) which is private as well and can only be read with getClientId(). The protected field keepAliveSeconds (integer) defines how often the client signals that it is still alive; its default value is 60. DEFAULT_PORT is a public class constant with the value 1883. All methods are public: connect() opens the session and returns true on success, disconnect() closes it and returns nothing. publish() takes a topic, a message (both text) and a flag retained (true/false) and returns nothing. subscribe() takes a topic and returns true if the broker accepted the subscription. isConnected() tells whether the session is currently open.

Ergänze das Klassenmodell um die Klasse MqttConnection mit allen beschriebenen Attributen und Methoden. Jedes Türschild baut seine eigene Verbindung auf; die Verbindung „kennt“ das Türschild nicht. Ergänze auch diese Beziehung mit Multiplizitäten. (8 Punkte)

Klasse MqttConnection mit gerichteter Assoziation vom Türschild (Beispiellösung) (mit KI erstellt)

Bewertung:

  • vier Attribute mit Sichtbarkeit und Typ, Startwert 60 und Konstante DEFAULT_PORT statisch mit Wert 1883: 2 Punkte

  • Konstruktor mit zwei typisierten Parametern ohne Rückgabetyp: 1 Punkt

  • sechs Methoden mit vollständiger Signatur: je 0,5 Punkte (3 Punkte)

  • gerichtete Assoziation (Pfeil vom Türschild zur Verbindung, weil nur das Türschild die Verbindung kennt): 1 Punkt

  • Multiplizitäten 1 zu 1: 1 Punkt

Hinweise: Die englischen Bezeichner werden übernommen, weil sie aus der Bibliothek stammen. Wird die Beziehung als Attribut -verbindung: MqttConnection im Türschild notiert, gibt das für die Beziehung 1 Punkt; die Multiplizitäten fehlen dann aber. Eine Komposition (Türschild als Ganzes, Verbindung als existenzabhängiges Teil) ist fachlich vertretbar und wird ebenfalls akzeptiert.

d) Die Klasse Tuerschild hat zwei Konstruktoren. Erläutere den Begriff Überladung an diesem Beispiel und begründe, warum ein zusätzlicher Konstruktor Tuerschild(String gebaeudeRaum, String ipAdresse) so nicht möglich wäre. (4 Punkte)

  • Überladene Methoden (oder Konstruktoren) haben denselben Namen, aber unterschiedliche Parameterlisten (Anzahl, Typen oder Reihenfolge der Typen), also unterschiedliche Signaturen. Beim Aufruf wird anhand der Argumente entschieden, welche Variante ausgeführt wird (2 Punkte).

  • Beispiel: new Tuerschild("A.104") ruft den Konstruktor mit einem Parameter auf, der das Topic selbst bildet; new Tuerschild("A.104", "barcamp/aula") ruft den Konstruktor mit zwei Parametern auf (1 Punkt).

  • Der zusätzliche Konstruktor hätte dieselbe Parameterliste (String, String) wie der vorhandene zweite Konstruktor. Parameternamen gehören nicht zur Signatur; der Compiler könnte die beiden nicht unterscheiden (1 Punkt).

e) Nach dem Barcamp-Morgen ändert sich der Sessionplan laufend. Die Klasse Sessionplaner soll alle Anzeigegeräte (Türschilder und Infomonitore) benachrichtigen, ohne deren Klassen zu kennen. Dazu implementieren beide Klassen das vorgegebene Interface Anzeigegeraet. Der Sessionplaner verwaltet beliebig viele angemeldete Anzeigegeräte; die Geräte existieren aber auch ohne den Sessionplaner.

Unvollständiges Klassendiagramm mit Sessionplaner, Interface Anzeigegeraet, Tuerschild und Infomonitor ohne Beziehungen (mit KI erstellt)

Vervollständige das Klassendiagramm: Ergänze die fehlenden Methoden in Tuerschild und Infomonitor sowie alle Beziehungen mit Multiplizitäten. (5 Punkte)

Vervollständigtes Klassendiagramm mit Realisierungen und Aggregation (Beispiellösung) (mit KI erstellt)

Bewertung:

  • zwei Realisierungen (gestrichelte Linie mit hohlem Dreieck am Interface): je 1 Punkt (2 Punkte)

  • die beiden Interface-Methoden zeigeSession(s: Session) und leeren() in beiden Klassen: je 0,5 Punkte (2 Punkte)

  • Aggregation zwischen Sessionplaner (Raute) und Anzeigegeraet mit Multiplizitäten 1 und 0..*: 1 Punkt

Hinweise: Eine Klasse, die ein Interface implementiert, muss alle seine Methoden bereitstellen; deshalb werden sie im Klassendiagramm erneut aufgeführt. Die Beziehung zeigt auf das Interface, nicht auf die konkreten Klassen – genau dadurch bleibt der Sessionplaner von Türschild und Infomonitor unabhängig. Eine einfache (gerichtete) Assoziation statt der Aggregation wird mit 0,5 Punkten bewertet.

f) Der Sessionplaner soll künftig den kompletten Plan eines Türschilds auslesen können. Emre schlägt zwei Varianten für eine neue Methode vor (Arrays stammt aus java.util):

// Variante A
public String[] getBelegung() {
    return belegung;
}

// Variante B
public String[] getBelegung() {
    return Arrays.copyOf(belegung, belegung.length);
}

Beurteile beide Varianten im Hinblick auf die Kapselung: Kann eine andere Klasse über den Rückgabewert die Belegung des Türschilds ändern und dabei die Kürzung durch kuerze() umgehen? Notiere außerdem die neue Methode so, wie sie im Klassendiagramm erscheint. (4 Punkte)

  • Variante A liefert keinen neuen Plan, sondern einen Verweis auf das private Array des Türschilds. Eine andere Klasse kann damit z. B. schild.getBelegung()[0] = "Ein sehr langer Sessiontitel ohne Kürzung"; ausführen und ändert so die Belegung, ohne dass aktualisiere() und kuerze() beteiligt sind. Das Attribut ist zwar private, die Kapselung ist aber durchbrochen (1,5 Punkte).

  • Variante B gibt eine Kopie zurück. Änderungen des Aufrufers betreffen nur die Kopie; das Array im Türschild bleibt unverändert, Änderungen laufen weiter nur über aktualisiere(). Die Kapselung bleibt gewahrt; dafür kostet jeder Aufruf etwas Speicher und Rechenzeit für die Kopie (1,5 Punkte).

  • Im Klassendiagramm sehen beide Varianten gleich aus: +getBelegung(): String [0..*] (auch String[] ist richtig). Der Unterschied steckt nur in der Implementierung (1 Punkt).

Aufgabe 2.3: Inserate und Buchungen in der Mitfahr-App (Kernkompetenz)

(ca. 30 min Bearbeitungszeit)

Du arbeitest als Auszubildende*r im FIA-Projektteam der Mitfahr-App RatzFahrt am Ratz und Rübe Berufskolleg. Bisher greift die App direkt auf die Datenbank zu. Für die neue Version soll die Fachlogik objektorientiert umgesetzt werden. Oksana Melnyk hat mit Projektleiter Thomas Becker die Anforderungen gesammelt:

  • Fahrer*innen veröffentlichen Angebote, Mitfahrende veröffentlichen Gesuche. Beides sind Inserate. Ein Inserat ist immer entweder ein Angebot oder ein Gesuch; ein „allgemeines“ Inserat darf nicht erzeugt werden.

  • Jedes Inserat hat einen Abfahrtszeitpunkt und eine Richtung. Beide sollen auch in Unterklassen direkt zugreifbar sein, aber nicht von außen. Für Zeitpunkte gibt es den Datentyp Zeitpunkt, für die Richtung die Aufzählung Richtung (ZUR_SCHULE, NACH_HAUSE).

  • Jedes Inserat bezieht sich auf genau einen Haltepunkt (Name und Ort, beide Text). An einem Haltepunkt gibt es beliebig viele Inserate; ein Haltepunkt muss seine Inserate nicht kennen. Der Name eines Haltepunkts kann abgefragt werden.

  • Haltepunkt und Richtung eines Inserats können abgefragt werden.

  • Jedes Inserat liefert mit beschreibung() einen Text für die Flurmonitore. Angebote und Gesuche erzeugen diesen Text unterschiedlich.

  • Ein Angebot hat eine Anzahl freier Plätze und einen Kostenbeitrag in Euro. Es kann prüfen, ob es voll ist, und eine Anfrage einer mitfahrenden Person annehmen (Rückgabe, ob das geklappt hat).

  • Ein Gesuch hat zusätzlich einen spätesten Abfahrtszeitpunkt.

  • Nimmt ein Angebot eine Anfrage an, entsteht eine Buchung mit dem Anfragezeitpunkt und der Angabe, ob sie bestätigt ist (zu Beginn nicht). Eine Buchung gehört zu genau einem Angebot und kann ohne dieses nicht existieren; wird ein Angebot gelöscht, werden seine Buchungen mitgelöscht. Jede Buchung verweist auf genau eine mitfahrende Person (Klasse Nutzer, bereits vorhanden). Eine Buchung kann bestätigt werden.

  • Jedes Inserat wird von genau einem Nutzer erstellt; ein Nutzer kann beliebig viele Inserate erstellen.

  • Die Fahrtenbörse verwaltet alle Inserate. Inserate können hinzugefügt werden. Die Methode offeneAngebote liefert für einen Haltepunkt und eine Richtung alle Angebote, die noch nicht voll sind. Inserate bestehen auch, wenn die Fahrtenbörse neu gestartet wird.

  • Alle Klassen erhalten passende öffentliche Konstruktoren; alle übrigen Attribute sind privat, alle genannten Methoden öffentlich.

a) Entwickle aus den Anforderungen ein UML-Klassendiagramm und zeichne es. Es soll die Klassen Fahrtenboerse, Inserat, Angebot, Gesuch, Buchung und Haltepunkt mit Attributen, Methoden (vollständige Signatur), Sichtbarkeiten sowie alle Beziehungen mit Multiplizitäten enthalten. Die Klasse Nutzer musst Du nur als Kasten ohne Inhalt zeichnen. (18 Punkte)

Klassendiagramm der Mitfahrbörse mit abstrakter Klasse Inserat, Vererbung, Aggregation, Komposition und Assoziationen (Beispiellösung) (mit KI erstellt)

Bewertung:

  • sechs Klassen mit passenden Attributen (Sichtbarkeit # für abfahrt und richtung, sonst -; Startwert false bei bestaetigt): je 1 Punkt (6 Punkte)

  • Methoden und Konstruktoren mit vollständiger Signatur und Sichtbarkeit: 5 Punkte (z. B. 1 Punkt je Klasse ohne Haltepunkt, Abzug bei fehlenden Typen oder Konstruktoren mit Rückgabetyp)

  • Inserat und beschreibung() als abstrakt gekennzeichnet (kursiv, {abstract} oder <<abstract>>), beschreibung() in beiden Unterklassen erneut aufgeführt: 1 Punkt

  • Vererbung Angebot/Gesuch → Inserat: 1 Punkt

  • Aggregation Fahrtenboerse ◇– Inserat: 1 Punkt

  • Komposition Angebot ◆– Buchung: 1 Punkt

  • Assoziationen Inserat → Haltepunkt (gerichtet), Buchung → Nutzer und Nutzer – Inserat: 2 Punkte

  • Multiplizitäten an allen Beziehungen: 1 Punkt

Hinweise:

  • Der Konstruktor der abstrakten Klasse ist sinnvoll, weil die Unterklassen ihn aufrufen, um die gemeinsamen Attribute zu setzen. Er darf auch # (protected) sein.

  • Wer die Teile zusätzlich als Attribut notiert (z. B. -inserate: Inserat [0..*] in der Fahrtenbörse oder -buchungen: Buchung [0..*] im Angebot), stellt dieselbe Information doppelt dar; das ist richtig, aber nicht nötig.

  • offeneAngebote gibt mehrere Angebote zurück: Angebot [0..*], Angebot[] oder List<Angebot>.

  • Andere sinnvolle Namen (z. B. getBeschreibung()) sind richtig.

b) Erläutere anhand Deines Diagramms den Unterschied zwischen der Beziehung Fahrtenboerse–Inserat und der Beziehung Angebot–Buchung. Gehe dabei auf die Lebensdauer der Objekte ein. (4 Punkte)

  • Aggregation (Fahrtenbörse–Inserat, hohle Raute am Ganzen): Die Fahrtenbörse fasst Inserate zusammen, die Inserate können aber auch unabhängig von ihr bestehen. Wird das Fahrtenbörsen-Objekt gelöscht (z. B. bei einem Neustart), bleiben die Inserat-Objekte erhalten und können einer neuen Fahrtenbörse wieder hinzugefügt werden (2 Punkte).

  • Komposition (Angebot–Buchung, gefüllte Raute am Ganzen): Eine Buchung ist existenzabhängig von genau einem Angebot. Sie wird zusammen mit bzw. durch das Angebot erzeugt und endet spätestens mit ihm: Wird das Angebot gelöscht, werden auch seine Buchungen gelöscht. Eine Buchung kann nicht zu einem anderen Angebot wechseln (2 Punkte).

c) Formuliere die Methode offeneAngebote der Klasse Fahrtenboerse in Pseudocode. Die Fahrtenbörse speichert ihre Inserate in der Liste inserate. Hinweis: Mit x istInstanzVon Angebot kannst Du prüfen, ob ein Objekt ein Angebot ist; mit (Angebot) x behandelst Du es danach als Angebot. (5 Punkte)

öffentlich offeneAngebote(hp: Haltepunkt, r: Richtung): Liste von Angebot
    ergebnis := neue leere Liste von Angebot
    für jedes inserat in inserate
        wenn inserat istInstanzVon Angebot dann
            angebot := (Angebot) inserat
            wenn angebot.getHaltepunkt() = hp
                 und angebot.getRichtung() = r
                 und nicht angebot.istVoll() dann
                ergebnis.hinzufuegen(angebot)
            ende wenn
        ende wenn
    ende für
    rückgabe ergebnis
ende Methode

Bewertung: Methodenkopf mit Parametern und Rückgabetyp 1 Punkt, Ergebnisliste anlegen und zurückgeben 1 Punkt, Schleife über alle Inserate 1 Punkt, Typprüfung 1 Punkt, Bedingung mit Haltepunkt, Richtung und istVoll() sowie Hinzufügen 1 Punkt.

Hinweis: Zugriff auf angebot.freiePlaetze statt istVoll() wäre nicht erlaubt, weil das Attribut privat ist.

d) Thomas Becker möchte, dass Fahrer*innen auch regelmäßige Fahrten anbieten können, z. B. jeden Montag und Donnerstag bis zum Schuljahresende. Entwirf dazu eine Ergänzung des Klassendiagramms: eine Klasse Pendelangebot mit den Wochentagen (Aufzählung Wochentag, vorhanden), dem letzten Gültigkeitstag und einer Methode, die prüft, ob die Fahrt an einem bestimmten Wochentag stattfindet. Ergänze auch die Beziehung zu den vorhandenen Klassen. (3 Punkte)

Pendelangebot als Spezialisierung von Angebot (Beispiellösung) (mit KI erstellt)

Bewertung: Klasse mit Vererbung von Angebot 1 Punkt, Attribute (wochentage mehrwertig, gueltigBis) 1 Punkt, Methode findetStattAm(tag: Wochentag): Boolean und überschriebene beschreibung() 1 Punkt.

Ein Pendelangebot ist ein besonderes Angebot – es hat Plätze, Kostenbeitrag und Buchungen. Deshalb erbt es von Angebot und nicht direkt von Inserat.

e) Erläutere, warum die Klasse Inserat nicht instanziiert werden kann und warum die Methode beschreibung() in Inserat abstrakt ist, in Angebot und Gesuch aber noch einmal aufgeführt wird. (3 Punkte)

  • Inserat ist eine abstrakte Klasse: Laut Anforderung gibt es kein „allgemeines“ Inserat, nur Angebote und Gesuche. Von abstrakten Klassen können keine Objekte erzeugt werden; sie fassen das Gemeinsame der Unterklassen zusammen (1 Punkt).

  • beschreibung() ist abstrakt, weil es keine allgemeingültige Umsetzung gibt; die Methode legt nur die Signatur fest. Eine Klasse mit einer abstrakten Methode muss selbst abstrakt sein (1 Punkt).

  • Die Unterklassen überschreiben die Methode mit ihrer eigenen Umsetzung; deshalb steht sie dort noch einmal (ohne {abstract}). Ruft der Flurmonitor beschreibung() für ein beliebiges Inserat auf, wird zur Laufzeit die passende Methode des konkreten Objekts ausgeführt (späte Bindung, Polymorphie) (1 Punkt).


Hinweis zur Nachnutzung als Open Educational Resource (OER)

Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Übungsaufgaben zum UML-Klassendiagramm” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/uml-klassendiagramm-uebungsaufgaben veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/uml/uml-diagramme. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 29.10.2026.

[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: