Menu
Coddy logo textTech

Gemeinsam vs. Einzigartig

Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 35 von 70.

Bei der Arbeit mit Vererbung ist es wichtig zu verstehen, wo sich jedes Datenelement befindet. Einige Attribute werden geteilt: Sie werden in der übergeordneten Klasse definiert und sind für alle untergeordneten Klassen zugänglich. Andere sind einzigartig: Sie werden speziell in der untergeordneten Klasse oder Instanz erstellt.

Betrachte diese Hierarchie:

local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia"  -- Gemeinsam: auf der Klasse definiert

function Animal:new(name)
    local obj = {name = name}  -- Einzigartig: auf jeder Instanz gespeichert
    setmetatable(obj, Animal)
    return obj
end
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark"  -- Gemeinsam für alle Dogs

function Dog:new(name, breed)
    local obj = Animal.new(Animal, name)
    obj.breed = breed  -- Einzigartig: jeder Dog hat seine eigene Rasse
    setmetatable(obj, Dog)
    return obj
end

Wenn du eine Dog-Instanz erstellst, sind einige Werte direkt im Objekt vorhanden, während andere über die Nachschlagkette gefunden werden:

local rex = Dog:new("Rex", "German Shepherd")

-- Einzigartig für diese Instanz (gespeichert auf rex)
print(rex.name)    -- "Rex"
print(rex.breed)   -- "German Shepherd"
-- Geteilt (gefunden über Lookup)
print(rex.sound)   -- "bark" (von Dog)
print(rex.kingdom) -- "Animalia" (von Animal)

Der entscheidende Unterschied: Felder, die Konstruktoren obj zuweisen, sind für jede Instanz einzigartig, während Felder, die direkt in Klassentabellen definiert sind, von allen Instanzen dieser Klasse und ihrer Unterklassen gemeinsam genutzt werden.

challenge icon

Aufgabe

Einfach

Sehen wir uns an, wie Daten durch eine Vererbungshierarchie fließen, indem wir ein Klassen-System aus Creature und Dragon erstellen. Du wirst direkt sehen, welche Attribute von allen Instanzen gemeinsam genutzt werden und welche für jedes einzelne Objekt einzigartig sind.

Du wirst deinen Code auf drei Dateien verteilen:

  • Creature.lua: Definiere deine Elternklasse mit einem gemeinsamen klassenweiten Attribut world = "Fantasy Realm", das alle Kreaturen gemeinsam nutzen. Füge einen :new(name)-Konstruktor hinzu, der den Namen der Kreatur als Instanzattribut speichert.
  • Dragon.lua: Definiere deine Kindklasse, die von Creature erbt. Füge ein gemeinsames klassenweites Attribut element = "fire" hinzu, das alle Drachen gemeinsam nutzen. Dein :new(name, color)-Konstruktor sollte den Konstruktor der Elternklasse für den Namen aufrufen und anschließend color als einzigartiges Instanzattribut für jeden Drachen hinzufügen.
  • main.lua: Erstelle zwei verschiedene Drachen und untersuche ihre Attribute, um den Unterschied zwischen gemeinsamen und einzigartigen Daten zu veranschaulichen.

Du erhältst zwei Eingaben:

  1. Den Namen und die Farbe des ersten Drachen, getrennt durch ein Komma (z. B. Smaug,red)
  2. Den Namen und die Farbe des zweiten Drachen, getrennt durch ein Komma (z. B. Draco,gold)

Erstelle in deiner Hauptdatei beide Drachen mit ihren jeweiligen Namen und Farben. Gib anschließend die folgenden Informationen in genau dieser Reihenfolge aus:

  1. name des ersten Drachen
  2. color des ersten Drachen
  3. name des zweiten Drachen
  4. color des zweiten Drachen
  5. element des ersten Drachen (gemeinsam aus der Dragon-Klasse)
  6. element des zweiten Drachen (gemeinsam aus der Dragon-Klasse)
  7. world des ersten Drachen (gemeinsam aus der Creature-Klasse)

Wenn die Eingaben beispielsweise Smaug,red und Draco,gold lauten, sollte die Ausgabe wie folgt aussehen:

Smaug
red
Draco
gold
fire
fire
Fantasy Realm

Beachte, dass name und color für jeden Drachen unterschiedlich sind (einzigartige Instanzattribute), während element und world für beide gleich sind (gemeinsame Klassenattribute, die über die Suchkette gefunden werden).

Probier es selbst

-- main.lua: Drachen erstellen und gemeinsame vs. einzigartige Attribute demonstrieren

local Dragon = require('Dragon')

-- Eingabe für ersten Drachen lesen (name,color)
local input1 = io.read()
-- Eingabe für zweiten Drachen lesen (name,color)
local input2 = io.read()

-- TODO: Die erste Eingabe parsen, um Name und Farbe zu extrahieren
-- Hinweis: Verwende string.match mit dem Muster "([^,]+),([^,]+)"

-- TODO: Die zweite Eingabe parsen, um Name und Farbe zu extrahieren

-- TODO: Den ersten Drachen mit seinem Namen und seiner Farbe erstellen

-- TODO: Den zweiten Drachen mit seinem Namen und seiner Farbe erstellen

-- TODO: Folgendes der Reihe nach ausgeben:
-- 1. Name des ersten Drachens
-- 2. Farbe des ersten Drachens
-- 3. Name des zweiten Drachens
-- 4. Farbe des zweiten Drachens
-- 5. Element des ersten Drachens (geteilt von der Dragon-Klasse)
-- 6. Element des zweiten Drachens (geteilt von der Dragon-Klasse)
-- 7. Welt des ersten Drachens (geteilt von der Creature-Klasse)
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 Objektorientierte Programmierung

Übe selbstständig: Online-Lua-Compiler