Menu
Coddy logo textTech

Attribute initialisieren

Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 9 von 70.

Der :new()-Konstruktor, den Sie gelernt haben, erzeugt Objekte, aber jede Instanz beginnt identisch. Echte Objekte benötigen eindeutige Daten – eine Person hat einen bestimmten Namen, ein Spieler hat einen Startpunktestand. Um Objekte nützlich zu machen, muss der Konstruktor Argumente akzeptieren und diese der neuen Instanz zuweisen.

So erweitern Sie den Konstruktor, um Initialwerte zu akzeptieren:

local Dog = {}
Dog.__index = Dog

function Dog:new(name, breed)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.breed = breed
    return instance
end

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

Der Konstruktor nimmt nun name und breed als Parameter entgegen. Nachdem die leere Instanz erstellt und ihre Metatabelle gesetzt wurde, weisen wir diese Werte direkt den Feldern der Instanz zu. Jedes erstellte Objekt wird sein eigenes name und breed haben.

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- Ausgabe: Ich bin Rex, ein German Shepherd
dog2:introduce()  -- Ausgabe: Ich bin Bella, ein Poodle

Beide Hunde teilen sich dieselbe :introduce()-Methode aus dem Prototyp, aber jeder hat seinen eigenen einzigartigen Namen und seine eigene Rasse, die in seiner Instanztabelle gespeichert sind. Dies ist die Stärke der Kombination von Prototypen mit parametrisierten Konstruktoren – gemeinsames Verhalten mit individuellem Zustand.

challenge icon

Aufgabe

Einfach

Lassen Sie uns eine Person-Klasse erstellen, die einzigartige Individuen mit eigenen Namen und Altern erzeugt. Sie werden Ihren Code über zwei Dateien hinweg organisieren, um eine ordnungsgemäße Modulstruktur zu üben.

Sie werden Folgendes erstellen:

  • Person.lua: Definieren Sie Ihre Person-Klasse mit einem Konstruktor, der einen Namen und ein Alter akzeptiert. Fügen Sie eine :introduce()-Methode hinzu, mit der sich jede Person selbst vorstellen kann.
  • main.lua: Binden Sie Ihr Person-Modul ein und erstellen Sie eine Personen-Instanz unter Verwendung der bereitgestellten Eingaben. Lassen Sie sie sich anschließend vorstellen.

Ihr :new(name, age)-Konstruktor sollte beide Werte akzeptieren und sie in der neuen Instanz speichern. Die :introduce()-Methode sollte genau in diesem Format drucken:

Hello, my name is [name] and I am [age] years old

Sie erhalten zwei Eingaben:

  1. Der Name der Person
  2. Das Alter der Person

Wenn die Eingaben beispielsweise Alice und 25 sind, sollte die Ausgabe wie folgt lauten:

Hello, my name is Alice and I am 25 years old

Spickzettel

Um Objekte mit eindeutigen Daten zu erstellen, erweitern Sie den :new()-Konstruktor so, dass er Parameter akzeptiert und diese der Instanz zuweist:

local Dog = {}
Dog.__index = Dog

function Dog:new(name, breed)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.breed = breed
    return instance
end

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

Erstellen Sie Instanzen mit unterschiedlichen Werten:

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- Ausgabe: I am Rex, a German Shepherd
dog2:introduce()  -- Ausgabe: I am Bella, a Poodle

Jedes Objekt verfügt über seine eigenen eindeutigen Daten, die in seiner Instanztabelle gespeichert sind, während es Methoden vom Prototyp gemeinsam nutzt.

Probier es selbst

-- Erfordert das Person-Modul
local Person = require('Person')

-- Eingabe lesen
local name = io.read()
local age = io.read()

-- TODO: Erstelle eine neue Person-Instanz mit Person:new(name, age)

-- TODO: Rufe die Methode introduce() für deine Person-Instanz auf
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Object Oriented Programming