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