Strukturen

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

Konstante Elementfunktionen

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.

Statische Elementfunktionen

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.

Vererbung

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.

In der Tiefe

Aufgabe

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

rdmd playground.d