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
endlocal 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
endWenn 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.
Aufgabe
EinfachUntersuchen 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 Klassenebeneworld = "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 Klassenebeneelement = "fire"hinzu, das alle Drachen gemeinsam haben. Dein Konstruktor:new(name, color)sollte den Elternkonstruktor für den Namen aufrufen und anschließendcolorals 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:
- Den Namen und die Farbe des ersten Drachen, durch ein Komma getrennt (z. B.
Smaug,red) - 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:
namedes ersten Drachencolordes ersten Drachennamedes zweiten Drachencolordes zweiten Drachenelementdes ersten Drachen (gemeinsam genutzt von der Klasse Dragon)elementdes zweiten Drachen (gemeinsam genutzt von der Klasse Dragon)worlddes 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 RealmBeachte, 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)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Das 'self'-Konzept
Tabellen mit FunktionenExplizites 'self'Die Doppelpunkt-SyntaxPunkt vs. DoppelpunktZusammenfassung – Beweglicher Punkt4Projekt: Digitale Bank
Projekt-SetupEinzahlungsmethode7Polymorphie & Überschreiben
Methoden überschreibenElternmethoden aufrufenDuck TypingGemeinsames InterfaceTyp prüfenRückblick - Mitarbeiterrollen10Projekt: Formen-Manager
Projekt-SetupRechteck-KlasseKreis-KlasseUmfang-MethodeFormen-SammlungGesamtflächeFormen filtern2Klassen-Prototyp-Muster
Das Prototyp-KonzeptVerknüpfung mit __indexDer :new()-KonstruktorAttribute initialisierenUnabhängige InstanzenZusammenfassung – Autofabrik5Operatorüberladung in OOP
Objekte addierenObjekte subtrahierenObjekte verkettenObjekte vergleichen (<, >)Rückblick – Wallet-Mathematik3Objektzustand und -verhalten
InstanzvariablenGetter-MethodenSetter-MethodenBerechnete EigenschaftenStrings formatierenGleichheitsprüfungenZusammenfassung – Studentennote6Grundlagen der Vererbung
Das Vererbungs-SetupMethoden vererbenDen Konstruktor erweiternChild-Methoden hinzufügenGemeinsam vs. EinzigartigZusammenfassung - Formen-Hierarchie9Komposition & Mixins
Has-A-BeziehungDelegationEinfache MixinsAnwendung mehrerer MixinsMixins vs. VererbungZusammenfassung – Roboter-Montage12Abschluss-Herausforderungen
Wiederholung - InventarsystemWiederholung - BenutzerverwaltungWiederholung - Score-TrackerFinaler OOP-CheckÜbe selbstständig: Online-Lua-Compiler