• Offizieller Beitrag

    Hier nun ein kleiner Exkurs zu Lua Objekten.
    Der Begriff "Objekt" ist in Lua eigentlich fehl am Platze, da es keinen Speichertyp Objekt gibt. In Lua spielt sich alles in Tables (Arrays) ab. Sämtliche Funktionen sind in Tables hinterlegt und Objekte sind nur Tables mit Zusatzfunktion. ;)

    Hier mal ein ganz einfaches Objekt ( eine Eigenschaft, eine Methode )


    Die Methode enthält als ersten Parameter das Schlüsselwort "self". Dies ist gewissermassen die Referenz auf den umschließenden Table-Konstruktor "{}", der der lokalen Variablen "object" zugewiesen wurde.
    Somit ist innerhalb des Objektes (table object) ein Zugriff auf andere Mitglieder des Objektes (Eigenschaften und Methoden) möglich. Dazu wird das Schlüsselwort "self" genutzt.
    Zugriff auf Eigenschaft, lesend: "wert = self.property", schreibend: "self.property = wert". Zugriff auf Methode: "retVal = self:Methode(param)" oder "retVal = self.Methode(self, param)".
    Auf das erstellte Objekt läßt sich dann analog zugreifen. Nur wird statt "self" die Objektvariable verwendet. Diese kann ich aber vor Anwendung auch an eine andere Variable übergeben:

    PHP
    local o = object
    Zugriff auf Eigenschaft, lesend:    wert = o.property
    schreibend: 						o.property = wert
    Zugriff auf Methode: 			   retVal = o:Methode(param)    oder   retVal = o.Methode(o, param)


    Bitte beim Methodenaufruf die beiden möglichen Syntaxformen beachten. Entweder "Objekt-Doppelpunkt-Methode(Parameter)" oder "Objekt-Punkt-Methode(Objekt, Parameter)".
    Wir können die Methoden unseres Objektes auch bequem in einem anderen Objekt anwenden. Dazu weisen wir dem anderen Objekt diese Methode einfach mit Bezug auf das Quellobjekt zu:

    Und hier ein kleines Anwendungsbeispiel.
    Wir erstellen ein simples Taschenrechner-Objekt, das folgendes können soll:
    - 4 Grundrechenarten (Übergabe von 2 Werten)
    - Speichern eines bestimmten Wertes, Speicherabruf, Speicher löschen
    - autom. Speichern letztes und aktuelles Ergebnis
    - abrufbare Historie (gesamt od. bestimmter Schritt) der durchgeführten Rechnungen, Historie löschen

    Spoiler anzeigen


    Das funktioniert alles, wie gewünscht.
    Der nächste Schritt ist nun, eine Klasse zu erstellen.
    Wozu Klassen?
    Wenn ich mehrere Objekte erstellen möchte, mit demselben Verhalten (Accounts, User in einem Spiel etc.) definiere ich einmalig ein Objekt dieser Klasse. Und immer wenn ich ein neues identisches Objekt benötige, wird eine neue Instanz des Klassenobjektes erstellt.
    Klassen im strengen Sinne gibt es in Lua nicht. Lua verwendet stattdessen das Prototyp-Konzept um Klassen zu emulieren. Dazu erstellen wir ein Objekt, das ausschließlich als Prototyp für seine Instanzen existiert.
    In Lua wird das, wie folgt, umgesetzt:

    PHP
    setmetatable(a, {__index = b})


    In diesem Fall ist "b" das Klassenobjekt. Mit diesem Aufruf durchsucht "a" das Objekt "b" nach Eigenschaften und Methoden, die es selbst nicht hat. Die MetaMethode "__index" sorgt für die Vererbung.
    Das wenden wir jetzt auf das erste Bsp. an und fügen dem Objekt die Methode "create" hinzu:


    Nun wollen wir ein anderes Objekt erstellen und diesem Objekt die Eigenschaften und Methoden des Prototyps hinzufügen:


    Jetzt testen, ob die alten Eigenschaften und Methoden noch zur Verfügung stehen

    PHP
    print( objX:getName() )                                     ---> "Test"


    Und das funktioniert.
    Ich kann also auf diese Weise nicht nur neue Objekte erstellen, sondern auch Objekte "mixen". Das ermöglicht gutes modulares Arbeiten.

    Lua kennt in Objekten keine Unterscheidung zwischen privat und public. Das liegt in der Tabellenstruktur begründet.
    Aber das ist kein Hindernis. Hier mal ein einfaches Bsp. eine Methode nur unter Bedingungen ausführen zu lassen: