Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m320_2024:learningunits:lu02:klassendiagramm [2024/04/17 18:15] – angelegt - Externe Bearbeitung 127.0.0.1 | modul:m320_2024:learningunits:lu02:klassendiagramm [2025/11/17 08:33] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
|---|---|---|---|
| Zeile 3: | Zeile 3: | ||
| In einem ersten Schritt beschränken wir uns auf die Darstellung einer Klasse in der Notationssprache UML ([[https:// | In einem ersten Schritt beschränken wir uns auf die Darstellung einer Klasse in der Notationssprache UML ([[https:// | ||
| {{: | {{: | ||
| - | //Abb:// Klassendigramm nach UML\\ | + | //Abb: Klassendigramm nach UML// |
| - | [[https:// | + | |
| + | [[wpde> | ||
| Die << | Die << | ||
| Erklärung zu den Elementen des Klassendiagramms: | Erklärung zu den Elementen des Klassendiagramms: | ||
| - | * **Attribute** sollten immer private deklariert werden, um deren Wertebereich garantieren zu können. | + | * **Attribute** sollten immer private deklariert werden, um deren Wertebereich garantieren zu können. //(Die Erklärung zu **data hiding** folgt in [[modul: |
| * **Konstruktoren** werden bei der Erzeugung eines Objekts als erstes ausgeführt und dienen primär dem Initilaisieren der Attribute. | * **Konstruktoren** werden bei der Erzeugung eines Objekts als erstes ausgeführt und dienen primär dem Initilaisieren der Attribute. | ||
| * **Methoden** stellen die Funktionalität der Klasse dar. Oft wird die Gesamtheit aller Methoden auch als <<die Schnittstelle>> | * **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. | Im folgenden Code-Stück werden diese Elemente zusätzlich beschrieben. | ||
| - | ---- | + | |
| - | //Beispiel | + | ==== Beispiel: Abstraktion einer Türe ==== |
| <code python> | <code python> | ||
| Zeile 26: | Zeile 25: | ||
| Das Verriegeln selber delegiert die Türe an ein Objekt vom Typ Door_lock (Türschloss). | 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, | + | # Der Konstruktor trägt IMMER den Namen __init__ und weist als ersten Parameter den Wert self auf. |
| - | # Attribute können aber auch mit einem fixen Wert initialisiert werden. | + | # Danach folgen die Übergabeparameter, |
| - | # Konstruktoren werden als Erstes im Programm angeschrieben. | + | # Attribute können aber auch mit einem fixen Wert initialisiert werden. |
| + | # Konstruktoren werden als Erstes im Programm angeschrieben. | ||
| def __init__(self, | def __init__(self, | ||
| """ | """ | ||
| Zeile 37: | Zeile 37: | ||
| :param base_color: | :param base_color: | ||
| """ | """ | ||
| - | # ein privates Attribut muss im Konstruktor initialisiert werden und ist dann in der Klasse | + | |
| - | # über self.__name_des_Attributs ansprechbar. | + | # über self.__name_des_Attributs ansprechbar. |
| - | self._the_door_lock | + | self._the_door_lock = ref2door_lock |
| - | # Hier wird der Setter eines Attributs aufgerufen (siehe unten) | + | # Hier wird der Setter eines Attributs aufgerufen (siehe unten) |
| - | self.color | + | self._color |
| - | self._door_is_open | + | self._door_is_open = False |
| self._door_is_locked = False | self._door_is_locked = False | ||
| - | # Nach den Konstruktoren folgen Methoden, die eine Verarbeitung auslösen. | + | |
| - | # Danach folgen Methoden, die auf ein Ereignis reagieren | + | # Danach folgen Methoden, die auf ein Ereignis reagieren |
| def open_the_door(self): | def open_the_door(self): | ||
| """ | """ | ||
| - | Methode für das öffnen | + | Methode für das Öffnen |
| Das ist aber nur möglich, wenn die Türe nicht verriegelt ist. | Das ist aber nur möglich, wenn die Türe nicht verriegelt ist. | ||
| """ | """ | ||
| - | if self._door_is_locked == False: | + | if not self.door_is_locked: |
| self._door_is_open = True | self._door_is_open = True | ||
| Zeile 64: | Zeile 64: | ||
| def lock_the_door(self): | def lock_the_door(self): | ||
| """ | """ | ||
| - | Methode für das verriegeln | + | Methode für das Verriegeln |
| Das ist nur möglich, wenn die Türe nicht offen ist. | Das ist nur möglich, wenn die Türe nicht offen ist. | ||
| - | Für das verriegeln | + | Für das Verriegeln |
| """ | """ | ||
| - | if self._door_is_open | + | if self._door_is_open |
| self._door_is_locked = self._the_door_lock.lock() | self._door_is_locked = self._the_door_lock.lock() | ||
| def unlock_the_door(self): | def unlock_the_door(self): | ||
| """ | """ | ||
| - | Methode für das entriegeln | + | Methode für das Entriegeln |
| Das ist nur möglich, wenn die Türe verriegelt ist. | Das ist nur möglich, wenn die Türe verriegelt ist. | ||
| - | Für das entriegeln | + | Für das Entriegeln |
| """ | """ | ||
| - | if self._door_is_locked: | + | if self.door_is_locked: |
| self._door_is_locked = self._the_door_lock.unlock() | self._door_is_locked = self._the_door_lock.unlock() | ||
| Zeile 88: | Zeile 88: | ||
| 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. | + | # getter werden mit der Anotation @property markiert. |
| @property | @property | ||
| def door_is_open(self): | def door_is_open(self): | ||
| Zeile 99: | Zeile 99: | ||
| @property | @property | ||
| - | def door_ist_locked(self): | + | def door_is_locked(self): |
| """ | """ | ||
| getter-Methode für den Zustand door_is_locked | getter-Methode für den Zustand door_is_locked | ||
| Zeile 114: | Zeile 114: | ||
| return self._color | return self._color | ||
| - | # setter werden mit der Anotation @name.setter markiert. | + | |
| @color.setter | @color.setter | ||
| def color(self, new_color): | def color(self, new_color): | ||
| Zeile 124: | Zeile 124: | ||
| - | |||
| - | """ | ||
| - | nur für die korrekte Übersetzung und Ausführung | ||
| - | """ | ||
| class DoorLock: | class DoorLock: | ||
| """ | """ | ||
| dummy Klasse, damit in der Klasse Tuere kein Fehler auftritt | dummy Klasse, damit in der Klasse Tuere kein Fehler auftritt | ||
| """ | """ | ||
| + | |||
| def __init__(self): | def __init__(self): | ||
| print(" | print(" | ||
| Zeile 140: | Zeile 137: | ||
| def unlock(self): | def unlock(self): | ||
| return False | return False | ||
| + | |||
| # Hier die main-Methode festlegen | # Hier die main-Methode festlegen | ||
| - | if __name__ | + | if __name__ == ' |
| print(' | print(' | ||
| the_door_lock = DoorLock() | the_door_lock = DoorLock() | ||
| - | the_door | + | the_door = Door(the_door_lock, |
| the_door.test() | the_door.test() | ||
| print(' | print(' | ||
| the_door.open_the_door() | the_door.open_the_door() | ||
| the_door.test() | the_door.test() | ||
| + | |||
| </ | </ | ||
| ---- | ---- | ||
| - | [[https:// | + | [[https:// |