Inhaltsverzeichnis

Lyx – Objektorientierte Programmierung (OOP)

Lyx kombiniert die Performance von Systemprogrammiersprachen mit der Ergonomie moderner OOP-Sprachen. Dabei wird strikt zwischen leichtgewichtigen Strukturen und mächtigen Klassen unterschieden.

1) Structs (Value-Types)

Strukturen sind Datengruppierungen, die standardmäßig auf dem Stack liegen. Sie sind ideal für kleine Objekte (Vektoren, Punkte, Farben), bei denen keine Vererbung benötigt wird.

Zuweisung: Erfolgt durch Kopieren des Inhalts (Copy-by-Value).

Methoden: Können Methoden besitzen, unterstützen aber keine Polymorphie.

type TPoint = struct {
x, y: int64;
 
fn Move(dx: int64, dy: int64) {
    self.x := self.x + dx;
    self.y := self.y + dy;
}
};

2) Klassen (Reference-Types)

Klassen sind komplexe Objekte, die auf dem Heap verwaltet werden. Sie unterstützen Vererbung, virtuelle Methoden und das Erstellen von Instanzen via new.

Definition und Vererbung

Alle Klassen stammen standardmäßig von TObject ab, sofern nicht anders angegeben.

type Entity = class {
var id: int64;
var name: pchar;
 
// Konstruktor (wird via new aufgerufen)
fn Create(newId: int64, newName: pchar) {
    self.id := newId;
    self.name := newName;
}
 
fn Describe() {
    PrintStr("Entity: ");
    PrintStr(self.name);
}
};
 
// Vererbung
type Player = class extends Entity {
var health: int32;
 
fn Describe() {
    super.Describe(); // Aufruf der Basisklasse
    PrintStr(" (HP: ");
    PrintInt(self.health as int64);
    PrintStr(")");
}
};

3) Lebenszyklus eines Objekts

Da Lyx keinen Garbage Collector hat, muss die Lebensdauer von Klassen-Instanzen manuell gesteuert werden.

Aktion Syntax Beschreibung
Erzeugen var p := new Player(1, „Hero“); Reserviert Heap-Speicher und ruft Create auf.
Nutzen p.Describe(); Zugriff auf Felder und Methoden.
Prüfen if (p == null) { … } Testet, ob die Referenz gültig ist.
Löschen dispose p; Ruft (geplant) Destruktor auf und gibt Speicher frei.

4) Encapsulation (Sichtbarkeit)

Lyx nutzt einfache Keywords, um den Zugriff auf Member zu steuern:

pub: Macht ein Feld oder eine Methode von außerhalb der Unit zugänglich.

(Standard): Ohne pub sind Member nur innerhalb der eigenen Unit sichtbar (Internal).

type Database = class {
pub var ConnectionString: pchar; // Öffentlich
var InternalSocket: int64;      // Privat (nur in dieser Unit)
};

5) Polymorphie & Type-Casting

In Lyx kannst du zur Laufzeit prüfen, ob ein Objekt von einem bestimmten Typ ist, und es sicher umwandeln.

is: Prüft die Typ-Kompatibilität.

as: Führt einen Cast durch (bei Klassen wird die Referenz umgedeutet).

fn Process(e: Entity) {
if (e is Player) {
let p := e as Player;
p.health := 100;
}
}