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/08/26 10:50] (aktuell) – kmaurizi | ||
---|---|---|---|
Zeile 2: | Zeile 2: | ||
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:// | ||
- | {{:modul:m320: | + | {{:modul:m320_2024: |
- | //Abb:// Klassendigramm nach UML\\ | + | //Abb: Klassendigramm nach UML// |
- | [[https://de.wikipedia.org/ | + | |
+ | [[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:// |