Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m320_2024:learningunits:lu02:klassendiagramm [2026/08/30 14:05] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | de:modul:m320_2024:learningunits:lu02:klassendiagramm [2026/08/30 14:06] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden msuter | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== LU02a - Klassendiagramm und Klasse ====== | ||
| + | |||
| + | In einem ersten Schritt beschränken wir uns auf die Darstellung einer Klasse in der Notationssprache UML ([[https:// | ||
| + | {{modul: | ||
| + | //Abb: Klassendigramm nach UML// | ||
| + | |||
| + | [[wpde> | ||
| + | |||
| + | Die << | ||
| + | |||
| + | Erklärung zu den Elementen des Klassendiagramms: | ||
| + | * **Attribute** sollten immer private deklariert werden, um deren Wertebereich garantieren zu können. //(Die Erklärung zu **data hiding** folgt in [[de: | ||
| + | * **Konstruktoren** werden bei der Erzeugung eines Objekts als erstes ausgeführt und dienen primär dem Initialisieren der Attribute. | ||
| + | * **Methoden** stellen die Funktionalität der Klasse dar. Oft wird die Gesamtheit aller Methoden auch als <<die Schnittstelle>> | ||
| + | Im folgenden Code-Stück werden diese Elemente zusätzlich beschrieben. | ||
| + | |||
| + | ==== Beispiel: Abstraktion einer Türe ==== | ||
| + | |||
| + | <code python> | ||
| + | class Door: | ||
| + | """ | ||
| + | Diese Klasse beschreibt eine Türe mit der Eigenschaft color (Farbe) und den Zuständen | ||
| + | door_is_open (für geöffnete Türe) sowie door_is_locked (für verriegelte Türe). | ||
| + | Die Türe überwacht die beiden Zustände und verhindert so Aktionen, die nicht möglich sind. | ||
| + | Das Verriegeln selber delegiert die Türe an ein Objekt vom Typ Door_lock (Türschloss). | ||
| + | """ | ||
| + | |||
| + | # Mit dem Keyword def wird eine Funktion bzw. eben ein Konstruktor deklariert. | ||
| + | # Der Konstruktor trägt IMMER den Namen __init__ und weist als ersten Parameter den Wert self auf. | ||
| + | # Danach folgen die Übergabeparameter, | ||
| + | # Attribute können aber auch mit einem fixen Wert initialisiert werden. | ||
| + | # Konstruktoren werden als Erstes im Programm angeschrieben. | ||
| + | def __init__(self, | ||
| + | """ | ||
| + | Erzeugt ein Tür-Objekt. | ||
| + | :param ref2door_lock: | ||
| + | :param base_color: | ||
| + | """ | ||
| + | # ein privates Attribut muss im Konstruktor initialisiert werden und ist dann in der Klasse | ||
| + | # über self.__name_des_Attributs ansprechbar. | ||
| + | self._the_door_lock = ref2door_lock | ||
| + | # Hier wird der Setter eines Attributs aufgerufen (siehe unten) | ||
| + | self._color = base_color | ||
| + | self._door_is_open = False | ||
| + | self._door_is_locked = False | ||
| + | |||
| + | # Nach den Konstruktoren folgen Methoden, die eine Verarbeitung auslösen. | ||
| + | # Danach folgen Methoden, die auf ein Ereignis reagieren | ||
| + | def open_the_door(self): | ||
| + | """ | ||
| + | Methode für das Öffnen der Türe. | ||
| + | Das ist aber nur möglich, wenn die Türe nicht verriegelt ist. | ||
| + | """ | ||
| + | if not self.door_is_locked: | ||
| + | self._door_is_open = True | ||
| + | |||
| + | def close_the_door(self): | ||
| + | """ | ||
| + | Methode für das schliessen der Türe. | ||
| + | Das geht immer, auch wenn die Türe schon geschlossen oder verriegelt ist. Der Zustand ändert dann nämlich nicht. | ||
| + | """ | ||
| + | self._door_is_open = False | ||
| + | |||
| + | def lock_the_door(self): | ||
| + | """ | ||
| + | Methode für das Verriegeln der Türe. | ||
| + | Das ist nur möglich, wenn die Türe nicht offen ist. | ||
| + | Für das Verriegeln ist aber das Türschloss zuständig. Es weiss wie das geht. | ||
| + | """ | ||
| + | if self._door_is_open is False: | ||
| + | self._door_is_locked = self._the_door_lock.lock() | ||
| + | |||
| + | def unlock_the_door(self): | ||
| + | """ | ||
| + | Methode für das Entriegeln der Türe | ||
| + | Das ist nur möglich, wenn die Türe verriegelt ist. | ||
| + | Für das Entriegeln ist aber das Türschloss zuständig. Es weiss wie das geht. | ||
| + | """ | ||
| + | if self.door_is_locked: | ||
| + | self._door_is_locked = self._the_door_lock.unlock() | ||
| + | |||
| + | def test(self): | ||
| + | """ | ||
| + | schreibt alle Attribute in den StdOut | ||
| + | """ | ||
| + | print(f' | ||
| + | print(f' | ||
| + | print(f' | ||
| + | |||
| + | # Am Ende folgen die getter- und setter-Methoden für die Attribute der Klasse | ||
| + | # getter werden mit der Anotation @property markiert. | ||
| + | @property | ||
| + | def door_is_open(self): | ||
| + | """ | ||
| + | getter-Methode für den Zustand door_is_open | ||
| + | :return: true, wenn die Türe offen ist, sonst false | ||
| + | """ | ||
| + | return self._door_is_open | ||
| + | |||
| + | @property | ||
| + | def door_is_locked(self): | ||
| + | """ | ||
| + | getter-Methode für den Zustand door_is_locked | ||
| + | :return: true, wenn die Türe verriegelt ist, sonst false | ||
| + | """ | ||
| + | return self._door_is_locked | ||
| + | |||
| + | @property | ||
| + | def color(self): | ||
| + | """ | ||
| + | getter-Methode für die Eigenschaft color | ||
| + | :return: die Farbe des Objekts | ||
| + | """ | ||
| + | return self._color | ||
| + | |||
| + | # setter werden mit der Anotation @name.setter markiert. | ||
| + | @color.setter | ||
| + | def color(self, new_color): | ||
| + | """ | ||
| + | setter-Methode für die Eigenschaft color | ||
| + | :param new_color: | ||
| + | """ | ||
| + | self._color = new_color | ||
| + | |||
| + | |||
| + | class DoorLock: | ||
| + | """ | ||
| + | dummy Klasse, damit in der Klasse Tuere kein Fehler auftritt | ||
| + | """ | ||
| + | |||
| + | def __init__(self): | ||
| + | print(" | ||
| + | |||
| + | def lock(self): | ||
| + | return True | ||
| + | |||
| + | def unlock(self): | ||
| + | return False | ||
| + | |||
| + | |||
| + | # Hier die main-Methode festlegen | ||
| + | if __name__ == ' | ||
| + | print(' | ||
| + | the_door_lock = DoorLock() | ||
| + | the_door = Door(the_door_lock, | ||
| + | the_door.test() | ||
| + | print(' | ||
| + | the_door.open_the_door() | ||
| + | the_door.test() | ||
| + | |||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | [[https:// | ||