====== 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; } }