LU08b - Zweiseitige Beziehungen

Bei einer zweiseitigen Beziehung kennt ein Objekt A ein anderes Objekt B und umgekehrt.

Beispiel: Lernende/r und Lehrperson

Klassendiagramm

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 «setter»-Methode gleich auch die „Rückbeziehung“ gesetzt.

Hinweis: Programmtechnisch muss einfach sichergestellt werden, dass eine schon bestehende Beziehung nicht noch einmal zugewiesen wird.

Sequenzdiagramm

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

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

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)                                         
 
 

René Probst, bearbeitet durch Marcel Suter