Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m320_2024:learningunits:lu04:konstruktor [2026/08/30 14:05] – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | de:modul:m320_2024:learningunits:lu04:konstruktor [2026/08/30 14:06] (aktuell) – ↷ Links angepasst, weil Seiten im Wiki verschoben wurden msuter | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== LU04a - Konstruktor ====== | ||
| + | <WRAP center round info 60%> | ||
| + | Konstruktoren dienen der Initialisierung von Objekten bei deren Erzeugung. Der Code des Konstruktors wird genau einmal ausgeführt. | ||
| + | </ | ||
| + | |||
| + | ===== Merkmale ===== | ||
| + | * Ein Konstruktor liefert KEINEN Rückgabewert. | ||
| + | * Ein Konstruktor kann die Attribute mit einem Defaultwert setzen oder mittels Parameter konkrete Werte zuweisen. | ||
| + | * Ein Konstruktor führt i.d.R. keine Programmlogik aus. | ||
| + | |||
| + | ===== Default Konstruktor ===== | ||
| + | Er wird OHNE Parameter aufgerufen und initialisiert alle Attribute mit einem vorgegebenen Wert (Default-Wert). | ||
| + | |||
| + | ==== Beispiel: Default Konstruktor ==== | ||
| + | <code python> | ||
| + | class Shoe: | ||
| + | def __init__(self): | ||
| + | self._shoe_size = 40 | ||
| + | self._color | ||
| + | self._shoe_type = ' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Parametrierter Konstruktor ===== | ||
| + | Ein Konstruktor kann Initialwerte entgegennehmen und ein Objekt so in einem definierten Zustand erzeugen. | ||
| + | Es empfiehlt sich, die Attribute mit einem Initalwert zu versehen, damit keine undefinierten Werte resultieren können. | ||
| + | Dies ist vor allem bei Wertzusicherungen wichtig. | ||
| + | |||
| + | |||
| + | ==== Beispiel: Parametrierter Konstruktor ==== | ||
| + | <code python> | ||
| + | class Shoe: | ||
| + | def __init__(self, | ||
| + | self._shoe_size = shoe_size | ||
| + | self._color | ||
| + | self._shoe_type = shoe_type | ||
| + | </ | ||
| + | |||
| + | ===== Objekte erzeugen ===== | ||
| + | ==== Ohne Werte ==== | ||
| + | |||
| + | Wird ein Objekt erzeugt, ohne Werte anzugeben (Default-Konstruktor), | ||
| + | Der entsprechende Aufruf sieht dann wie folgt aus: | ||
| + | <code python> | ||
| + | shoe = Shoe() | ||
| + | </ | ||
| + | |||
| + | ==== Initialwerte angeben ==== | ||
| + | Werden beim Erzeugen eines Objekts Initialwerte mitgegeben, müssen Sie Sie die Reihenfolge der Parameter einhalten. | ||
| + | Im Beispiel sieht dies so aus: | ||
| + | <code python> | ||
| + | shoe = Shoe(44, ' | ||
| + | </ | ||
| + | |||
| + | Eine andere (bessere?) Möglichkeit ist es, die Namen der Attribute beim Aufruf mitzugeben: | ||
| + | |||
| + | <code python> | ||
| + | shoe = Shoe(color=' | ||
| + | </ | ||
| + | |||
| + | Diese Variante ist vor allem sinnvoll, wenn nur ein Teil der definierten Parameter mitgegeben wird. | ||
| + | |||
| + | ===== Überladen (Overloading) ===== | ||
| + | |||
| + | Viele Programmiersprachen kennen die oben gezeigte Möglichkeit der Benennung von Parametern nicht. | ||
| + | Daher wird bei der Nutzung unterschiedlicher Konstruktoren das Konzept des Überladens (**overloading**) angewendet. | ||
| + | Dabei darf ein Methodenname mehrfach deklariert werden, solange die Paramterliste eine klare Unterscheidung (bezüglich der Datentypen) zulässt. | ||
| + | Als Beispiel wird hier der Code der Klasse '' | ||
| + | |||
| + | ==== Java-Code für parametrierte Konstruktoren ==== | ||
| + | |||
| + | <code java> | ||
| + | public class Shoe{ | ||
| + | // Deklaration der Attribute und Zuweisung der Initialwerte | ||
| + | private int shoe_size | ||
| + | private String color = " | ||
| + | private String shoe_type = " | ||
| + | | ||
| + | public Shoe(){ | ||
| + | // do nothing --> Default Konstruktor | ||
| + | // die Attribute sind hier mit den oben zugewiesenen Werten initialisert. | ||
| + | } | ||
| + | | ||
| + | public Shoe(int size){ | ||
| + | // überladener Konstruktor mit einem Parameter | ||
| + | this(); | ||
| + | shoe_size = size; | ||
| + | } | ||
| + | | ||
| + | public Shoe(int size, String color){ | ||
| + | // überladener Konstruktor mit zwei Parametern | ||
| + | this(size); // Aufruf des Konstruktors mit dem Parameter size | ||
| + | this.color = color; // um das Attribut vom Parameter zu unterscheiden, | ||
| + | } | ||
| + | | ||
| + | public Shoe(int size, String color, String type){ | ||
| + | // überladener Konstruktor mit drei Parametern | ||
| + | this(size, color); // Aufruf des Konstruktors mit den Parametern size und color | ||
| + | shoe_type = type; | ||
| + | } | ||
| + | : | ||
| + | : | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | Bei der Objekterzeugung wird je nach Parameterliste dann auf den entsprechende Konstruktor zugegriffen. | ||
| + | <code java> | ||
| + | .... | ||
| + | Shoe shoe_1 = new Shoe(); | ||
| + | Shoe shoe_2 = new Shoe(45); | ||
| + | Shoe shoe_3 = new Shoe(39, ' | ||
| + | Shoe shoe_4 = new Shoe(41, ' | ||
| + | </ | ||
| + | |||
| + | ==== UML-Klassendiagramm mit überladenen Konstruktoren ==== | ||
| + | |||
| + | Diese Technik hat sich auch in die Darstellung der UML übertragen. So wird im Klassendiagramm für jede mögliche Parameterliste der Konstruktor vollständig angeschrieben. | ||
| + | |||
| + | {{modul: | ||
| + | //Abb: UML-Klassendiagramm mit überladenen Konstruktoren// | ||
| + | |||
| + | ===== Python-Lösung ===== | ||
| + | Python verwendet Defaultwerte für Argumente, anstelle die Methoden zu überladen. | ||
| + | Jeder Parameter, der beim Aufruf keinen Wert erhält, nutzt den Defaultwert. | ||
| + | |||
| + | <code python> | ||
| + | class Shoe: | ||
| + | def __init__(self, | ||
| + | | ||
| + | | ||
| + | | ||
| + | self._shoe_size = shoe_size | ||
| + | self._color = color | ||
| + | self._type = type | ||
| + | | ||
| + | if __name__ == ' | ||
| + | sneaker = Shoe(46, ' | ||
| + | normal = Shoe() | ||
| + | </ | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | Falls ein Teil der Parameter **keinen** Defaultwert haben, müssen diese immer zuerst angegeben werden. | ||
| + | </ | ||
| + | <code python> | ||
| + | ... | ||
| + | def __init__(self, | ||
| + | color | ||
| + | | ||
| + | | ||
| + | ... | ||
| + | </ | ||
| + | In diesem Beispiel hat '' | ||
| + | Daher muss dieser Parameter als erstes (direkt nach '' | ||
| + | ---- | ||
| + | {{tag> | ||
| + | [[https:// | ||