Ein Weg einen Verbundtyp oder eigenen Typ in D zu definieren ist durch Strukturen,
welche mit der Anweisung struct
definiert werden:
struct Person {
int alter;
int groeese;
float alterXGroeese;
}
Strukturen werden immer auf den Stack alloziert (außer wenn sie explizit mit new
erzeugt werden)
und werden bei Zuweisungen oder Parametern in Funktionsaufrufen immer kopiert.
auto p = Person(30, 180, 3.1415);
auto t = p; // Kopie
Wenn ein neues Objekt des struct
Types erzeugt wird, können die Elemente in
ihrer Reihenfolge, in der sie in der Struktur definiert sind, initialisiert werden.
Ein eigener Konstruktor kann durch eine this(...)
Elementfunktion definiert werden.
Um Namenskonflikte zu vermeiden, kann die aktuelle Instanz explizit mit this
adressiert werden:
struct Person {
this(int alter, int groesse) {
this.alter = alter;
this.groesse = groesse;
this.alterXGroesse = cast(float)alter * groesse;
}
...
Person p(30, 180); // Initialisierung
p = Person(30, 180); // Zuweisung einer neuen Instanz
Ein struct
kann beliebig viele Elementfunktionen beinhalten. Diese sind
standardmäßig public
und von Anderen erreichbar. Es ist jedoch möglich
auch das Zugriffslevel auf private
zu setzen. private
Funktionen sind nur
von Elementfunktionen der gleichen Struktur oder im gleichen Modul erreichbar:
struct Person {
void erledigeAufgaben() {
...
private void geheimeAufgabe() {
...
p.erledigeAufgaben(); // Aufruf der Methode
p.geheimeAufgabe(); // FEHLER
Wenn eine Elementfunktion mit const
deklariert wird, ist es innerhalb der Funktion
es nicht erlaubt Inhalte der Struktur zu verändern. Dies wird durch den Compiler überprüft.
Wenn eine Funktion als const
markiert wurde, ist sie von einem const
oder immutable
Objekt aus aufrufbar, aber garantiert dem Aufrufer auch, dass
die Funktion den Zustand der Struktur niemals ändern wird.
Wenn eine Elementfunktion als static
(statisch) deklariert wird, ist sie
auch ohne eine Objektinstanz aufrufbar, z.B. die Methode Person.statischeAufgabe
kann direkt
aufgerufen werden, jedoch haben statische Elementfunktionen keinen Zugriff
auf nicht-statische Elemente. Eine statische Elementfunktion kann zum Beispiel
den Zugriff auf alle Instanzen ermöglichen. Das bekannte Singleton
Entwurfsmuster verwendet ebenso static
.
Es sollte beachtet werden, dass ein struct
nicht von einem anderen struct
erben kann.
Hierarchien von Typen können nur mit Klassen konstruiert werden, welche in der
folgenden Lektion vorgestellt werden. Es ist jedoch möglich mit alias this
oder mixins
polymorphe Vererbung zu erreichen.
Gegeben ist ´struct Vector3`. Implementiere die folgenden Funktionen und lasse so die Anwendung erfolgreich laufen:
laenge()
- gibt die Länge des Vektors zurück
skalar(Vector3)
- ermittelt das Skalarprodukt von zwei Vektoren
toString()
- gibt die Repräsentation des Vektors als String
Die Funktion std.string.format
welche einen String mit printf
-ähnlicher Syntax (format("Zahl = %d", zahl)
wird in einer späterer Lektion erklärt