Menu
CoddyTech

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 die einzelnen Daten befinden. Einige Attribute werden gemeinsam genutzt: Sie sind in der Elternklasse definiert und für alle Kindklassen zugänglich. Andere sind einzigartig: Sie werden speziell in der Kindklasse oder der Instanz erstellt.

Betrachte diese Hierarchie:

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

function Animal:new(name)
    local obj = {name = name}  -- Individuell: in jeder Instanz gespeichert
    setmetatable(obj, Animal)
    return obj
end
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark"  -- Wird von allen Dogs gemeinsam genutzt

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 Suchkette gefunden werden:

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

-- Nur für diese Instanz gültig (in rex gespeichert)
print(rex.name)    -- "Rex"
print(rex.breed)   -- "German Shepherd"
-- Gemeinsam genutzt (durch Nachschlagen gefunden)
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 werden, von allen Instanzen dieser Klasse und ihren Unterklassen gemeinsam genutzt werden.

challenge icon

Aufgabe

Einfach

Untersuchen wir, wie Daten durch eine Vererbungshierarchie fließen, indem wir ein Klassensystem mit 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 verteilst deinen Code auf drei Dateien:

  • Creature.lua: Definiere deine Elternklasse mit einem gemeinsamen Attribut auf Klassenebene world = "Fantasy Realm", das alle Kreaturen gemeinsam haben. Füge einen Konstruktor :new(name) hinzu, der den Namen der Kreatur als Instanzattribut speichert.
  • Dragon.lua: Definiere deine Kindklasse, die von Creature erbt. Füge ein gemeinsames Attribut auf Klassenebene element = "fire" hinzu, das alle Drachen gemeinsam haben. Dein Konstruktor :new(name, color) sollte den Elternkonstruktor 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 gemeinsam genutzten und einzigartigen Daten zu veranschaulichen.

Du erhältst zwei Eingaben:

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

Erstelle in deiner Hauptdatei beide Drachen mit ihren jeweiligen Namen und Farben. Gib dann die folgenden Informationen genau in 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 genutzt von der Klasse Dragon)
  6. element des zweiten Drachen (gemeinsam genutzt von der Klasse Dragon)
  7. world des ersten Drachen (gemeinsam genutzt von der Klasse Creature)

Wenn die Eingaben beispielsweise Smaug,red und Draco,gold lauten, sollte die Ausgabe folgendermaßen 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 bei beiden gleich sind (gemeinsam genutzte Klassenattribute, die über die Suchkette gefunden werden).

Probier es selbst

-- main.lua: Erstelle Drachen und veranschauliche gemeinsame und individuelle Attribute

local Dragon = require('Dragon')

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

-- TODO: Parse die erste Eingabe, um name und color zu extrahieren
-- Hinweis: Verwende string.match mit dem Muster "([^,]+),([^,]+)"

-- TODO: Parse die zweite Eingabe, um name und color zu extrahieren

-- TODO: Erstelle den ersten Drachen mit seinem name und seiner color

-- TODO: Erstelle den zweiten Drachen mit seinem name und seiner color

-- TODO: Gib Folgendes in dieser Reihenfolge aus:
-- 1. name des ersten Drachen
-- 2. color des ersten Drachen
-- 3. name des zweiten Drachen
-- 4. Farbe des zweiten Drachen
-- 5. Element des ersten Drachen (von der Klasse Dragon übernommen)
-- 6. Element des zweiten Drachen (von der Klasse Dragon übernommen)
-- 7. Welt des ersten Drachen (von der Klasse Creature übernommen)
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