Objektorientierung
Der Bereich Objektorientierung prüft, ob du ein Modell aus Klassen, Beziehungen und Verantwortlichkeiten entwirfst, es im UML-Diagramm korrekt notierst und in Code mit Kapselung, Vererbung und Polymorphismus umsetzt.
Grundbegriffe
Eine Klasse ist der Bauplan, ein Objekt eine Instanz mit eigenem Zustand. Attribute beschreiben den Zustand, Methoden das Verhalten, der Konstruktor initialisiert das Objekt. Sichtbarkeiten: - privat, # geschützt, + öffentlich, ~ paketweit. Kapselung heißt: Attribute privat, Zugriff nur über Methoden – so bleiben Invarianten kontrollierbar.
Beziehungen im UML-Klassendiagramm
- Assoziation: Linie zwischen Klassen, Multiplizität an den Enden (
1,0..1,*,1..*). - Vererbung: durchgezogene Linie mit offenem Dreieck zur Oberklasse; bedeutet „ist ein“.
- Aggregation: leere Raute beim Ganzen; Teil kann ohne Ganzes existieren.
- Komposition: gefüllte Raute; Teil existiert nicht ohne Ganzes (Existenzabhängigkeit).
Im Objektdiagramm stehen Instanzen mit unterstrichenem Namen
objekt : Klasseund konkreten Attributwerten.
Vererbung und Polymorphismus
Eine Unterklasse erbt Attribute und Methoden und kann Methoden überschreiben (Overriding, gleiche Signatur). Beim Aufruf über eine Referenz des Oberklassentyps entscheidet erst die dynamische Bindung zur Laufzeit, welche Implementierung läuft – das ist Polymorphismus. Überladen (Overloading: gleicher Name, andere Parameterliste) wird dagegen zur Compile-Zeit aufgelöst und ist kein dynamischer Polymorphismus.
Durchgerechnetes Beispiel
Abstrakte Klasse Form mit flaeche(), Unterklassen Kreis(r) und Rechteck(a,b) überschreiben sie. Eine Liste List<Form> formen enthält beide Objekte; die Schleife ruft nur f.flaeche() auf.
Begründung: Der deklarierte Typ ist Form, der tatsächliche Typ Kreis bzw. Rechteck. Die Laufzeitumgebung wählt anhand des Objekts die passende Überschreibung; Kreis berechnet π·r², Rechteck a·b. Vorteil: Eine neue Unterklasse Dreieck erfordert keine Änderung der Schleife. Konstruktoren werden nicht vererbt; die Unterklasse ruft sie mit super(...) auf.
Typische Fallen
- Overloading und Overriding gleichsetzen.
- Pfeilrichtung der Vererbung umdrehen (Dreieck zeigt zur Oberklasse).
- Aggregation und Komposition an der Raute verwechseln.
- Vergessen, dass private Attribute in der Unterklasse nicht direkt sichtbar sind.
- Objekt- und Klassendiagramm vermischen: Objekte haben unterstrichene Namen und Werte.
- Fehlender
super()-Aufruf bei nicht-trivialem Oberklassenkonstruktor.