====== LU08b - Zweiseitige Beziehungen ====== Bei einer zweiseitigen Beziehung kennt ein Objekt A ein anderes Objekt B und umgekehrt.\\ ===== Beispiel: Lernende/r und Lehrperson ===== ==== Klassendiagramm ==== {{:modul:m320_2024:learningunits:lu08:klasseteacher.png?600|}} //Abb: Klassen in einer zweiseitigen Beziehung // Es ist offensichtlich, dass eine Lehrperson nicht zu jedem Student und umgekehrt nicht jeder Student zu einer Lehrperson eine Beziehung pflegen muss. Wie im vorherigen Beispiel müssen daher auch hier die Objekte nicht zwingend eine Referenz zu einem anderen Objekt kennen, um existieren zu können. Es macht Sinn, die Zuweisung dann zu machen, wenn sie benötigt wird. Um sicherzugehen, dass immer eine zweiseitige Beziehung besteht, wird in der jeweiligen <>-Methode gleich auch die "Rückbeziehung" gesetzt. Hinweis: Programmtechnisch muss einfach sichergestellt werden, dass eine schon bestehende Beziehung nicht noch einmal zugewiesen wird. ==== Sequenzdiagramm ==== {{:modul:m320_2024:learningunits:lu08:sequenzteacher.png?400|}} //Abb: Sequenz-Diagramm der Zuweisung einer zweiseitigen Beziehung über Methoden // ==== Sourcecode ==== ==== Lernende/r und Lehrperson ==== class Teacher: def __init__(self, name): self._name = name self._student = None @student.setter def student(self, student): self._student = student student.teacher = self class Student: def __init__(self, name): self._name = name self._teacher = None @teacher.setter def teacher(self, teacher): self._teacher = teacher teacher.student = self if __name__ == '__main__': mia = Teacher('Mia') cathy = Student('Cathy') #ENTWEDER mia.student = cathy #ODER cathy.teacher = mia ===== Beispiel: Lernende/r und Schulklasse ===== ==== Klassendiagramm ==== {{:modul:m320_2024:learningunits:lu08:klasseschool.png?600|}} //Abb: Klassen in einer zweiseitigen Beziehung// Ein Student wird bei der Anmeldung einer Klasse zugewiesen. Daher macht es Sinn, diese Referenz über den Konstruktor mitzuteilen. Dabei muss die Klasse ''SchoolClass'' zeitlich vorher erstellt werden, damit die Referenz verfügbar ist. ==== Sequenzdiagramm ==== {{:modul:m320_2024:learningunits:lu08:sequenzschool.png?400|}} //Abb: Sequenz-Diagramm der Zuweisung einer zweiseitigen Beziehung über Konstruktor// ==== Sourcecode ==== class SchoolClass: def __init__(self, designation): self._designation = designation self._student = None @student.setter def student(self, student): self._student = student class Student: def __init__(self, name, the_class): self._name = name self._class = the_class the_class.student = self if __name__ == '__main__': i1a = SchoolClass('I1a') cathy = Student("Cathy", i1a) ---- {{tag>M320-LU08}} [[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] René Probst, bearbeitet durch Marcel Suter