Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:archiv:m320:learningunits:lu05:theorie:referenzen [2026/08/30 14:06] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | modul:archiv:m320:learningunits:lu05:theorie:referenzen [2026/08/30 14:09] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden 74.7.243.195 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ==== 1. Referenzen zuweisen ==== | ||
| + | Damit ein Objekt A ein anderes Objekt B ansprechen kann, muss es dessen Referenz kennen. Dazu muss die Referenz über den Konstruktor oder eine Methode übergeben werden.\\ | ||
| + | |||
| + | * einseitge Beziehungen | ||
| + | * zweiseitige Beziehungen | ||
| + | |||
| + | === Einseitige Beziehung === | ||
| + | |||
| + | Bei einer einseitigen Beziehung kennt ein Objekt A ein anderes Objekt B aber nicht umgekehrt.\\ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | //Beispiel 5.1: Geldbeutel und Besitzer// | ||
| + | |||
| + | {{modul: | ||
| + | |||
| + | //Abb 5.1:// Klassen in einer einseitigen Beziehung\\ | ||
| + | |||
| + | Eine Person kann auch keinen Geldbeutel besitzen. | ||
| + | Daher wird hier die Referenz über eine Methode gesetzt. | ||
| + | So sind die Erzeugung des Personen-Objekts und die Zuweisung der Referenz zeitlich unabhängig. | ||
| + | |||
| + | Dies zeigt das zugehörige Sequenz-Diagramm eindeutig auf. | ||
| + | |||
| + | {{modul: | ||
| + | |||
| + | //Abb 5.2:// Sequenz-Diagramm der Zuweisung einer einseitigen Beziehung über eine Methode | ||
| + | |||
| + | ---- | ||
| + | |||
| + | //Beispiel 5.2: Stromschalter und Wippe// \\ | ||
| + | |||
| + | {{modul: | ||
| + | |||
| + | //Abb 5.3:// Klassen in einer einseitigen Beziehung\\ | ||
| + | |||
| + | Ein Stromschalter braucht immer eine Wippe, sonst kann er ja nicht benutzt werden. | ||
| + | Daher muss sichergestellt sein, dass mit der Erzeugung des Stromschalter-Objektes auch die Referenz zu einer Wippe gesetzt wird. | ||
| + | Es ist also wichtig, dass die Referenz mit dem Konstruktor geliefert wird. | ||
| + | In diesem Fall ist es zwingend, dass die Wippe zeitlich zuerst erzeugt wird, so dass ihre Referenz verfügbar ist. | ||
| + | |||
| + | {{modul: | ||
| + | |||
| + | //Abb 5.4:// Sequenz-Diagramm der Zuweisung einer einseitigen Beziehung über den Konstruktor | ||
| + | |||
| + | ---- | ||
| + | |||
| + | === Zweiseitige Beziehung === | ||
| + | |||
| + | Bei einer zweiseitigen Beziehung kennt ein Objekt A ein anderes Objekt B und umgekehrt.\\ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | //Beispiel 5.3: Lernende/r und Lehrperson// | ||
| + | |||
| + | {{modul: | ||
| + | |||
| + | //Abb 5.5:// Klassen in einer zweiseitigen Beziehung \\ | ||
| + | |||
| + | Es ist offensichtlich, | ||
| + | Wie in Beispiel 5.1 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, | ||
| + | |||
| + | // | ||
| + | |||
| + | {{modul: | ||
| + | |||
| + | //Abb 5.6:// Sequenz-Diagramm der Zuweisung einer zweiseitigen Beziehung über Methoden \\ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | //Beispiel 5.4: Lernende/r und Schulklasse// | ||
| + | |||
| + | === Code-Beispiele === | ||
| + | |||
| + | Zu den oben erwähnten 4 Fällen finden Sie hier den passenden Code in Python und Java. | ||
| + | |||
| + | === Fall 1: === | ||
| + | |||
| + | Geldbeutel und Besitzer\\ | ||
| + | **Python**< | ||
| + | <code python> | ||
| + | class Person: | ||
| + | | ||
| + | | ||
| + | |||
| + | def __init__(self, | ||
| + | self._name | ||
| + | self._wallet = None # die Referenz wird erst später zugewiesen | ||
| + | |||
| + | @property | ||
| + | def name(self): | ||
| + | return self._name | ||
| + | } | ||
| + | @property | ||
| + | def wallet(self): | ||
| + | return self._wallet | ||
| + | } | ||
| + | @wallet.setter | ||
| + | def wallet(self, | ||
| + | self._wallet = wallet | ||
| + | } | ||
| + | | ||
| + | |||
| + | class Wallet: | ||
| + | |||
| + | def __init__(self): | ||
| + | pass } | ||
| + | | ||
| + | def deposit_money(self, | ||
| + | pass } | ||
| + | |||
| + | def withdraw_money(self, | ||
| + | pass } | ||
| + | } | ||
| + | |||
| + | | ||
| + | if __name__ == ' | ||
| + | person = Person(' | ||
| + | wallet = Wallet() | ||
| + | person.wallet = wallet | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | === Fall 2: === | ||
| + | |||
| + | Stromschalter und Wippe | ||
| + | |||
| + | <code python> | ||
| + | class PowerSwitch: | ||
| + | private String type; | ||
| + | private Seesaw seesaw; | ||
| + | |||
| + | def __init__(self, | ||
| + | self._type | ||
| + | self._seesaw = seesaw | ||
| + | } | ||
| + | @property | ||
| + | def type(self): | ||
| + | return self._type | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | class Seesaw: | ||
| + | | ||
| + | def __init__(self): | ||
| + | self._position = False /* Default-Konstruktor muss bei Java nicht angeschrieben werden */ | ||
| + | |||
| + | def press(self): | ||
| + | pass } | ||
| + | |||
| + | def resolve(self): | ||
| + | pass } | ||
| + | |||
| + | def is_pressed(self): | ||
| + | return self._position | ||
| + | } | ||
| + | } | ||
| + | |||
| + | public class App{ | ||
| + | if __name__ == ' | ||
| + | seesaw = Seesaw() | ||
| + | switch = PowerSwitch(' | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === Fall 3: === | ||
| + | |||
| + | Lernende/r und Lehrperson | ||
| + | |||
| + | <code python> | ||
| + | class Teacher: | ||
| + | private String name; | ||
| + | private Student ref2student; | ||
| + | | ||
| + | def __init__(self, | ||
| + | self._name | ||
| + | self._ref2student = None } | ||
| + | | ||
| + | @student.setter | ||
| + | def student(self, | ||
| + | self._ref2student = student | ||
| + | student.teacher = self student.setTeacher(this); | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | class Student: | ||
| + | private Strig name; | ||
| + | private Teacher ref2teacher; | ||
| + | | ||
| + | def __init__(self, | ||
| + | self._name | ||
| + | self._ref2teacher = None } | ||
| + | | ||
| + | @teacher.setter | ||
| + | def teacher(self, | ||
| + | self._ref2teacher = teacher | ||
| + | teacher.student = self teacher.setStudent(this); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | public class App{ | ||
| + | if __name__ == ' | ||
| + | mia = Teacher(' | ||
| + | cathy = Student(' | ||
| + | mia.student = cathy | ||
| + | #ODER // ODER | ||
| + | cathy.teacher = mia | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === Fall 4: === | ||
| + | |||
| + | Lernende/r und Schulklasse | ||
| + | |||
| + | <code python> | ||
| + | class SchoolClass: | ||
| + | private String designation; | ||
| + | private Stduent ref2student; | ||
| + | | ||
| + | def __init__(self, | ||
| + | self._designation = designation | ||
| + | self._ref2student = None } | ||
| + | | ||
| + | @student.setter | ||
| + | def student(self, | ||
| + | self._ref2student = student | ||
| + | } | ||
| + | } | ||
| + | |||
| + | class Student: | ||
| + | private String name; | ||
| + | private SchoolClass ref2class; | ||
| + | | ||
| + | def __init__(self, | ||
| + | self._name = name | ||
| + | self._ref2class = the_class | ||
| + | the_class.student = self theClass.setStudent(this); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | public class App{ | ||
| + | if __name__ == ' | ||
| + | i1a = SchoolClass(' | ||
| + | cathy = Student(" | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | [[https:// | ||