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
endlocal 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
endWenn 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.
Aufgabe
EinfachSehen 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 Attributworld = "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 Attributelement = "fire"hinzu, das alle Drachen gemeinsam nutzen. Dein:new(name, color)-Konstruktor sollte den Konstruktor der Elternklasse 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 gemeinsamen und einzigartigen Daten zu veranschaulichen.
Du erhältst zwei Eingaben:
- Den Namen und die Farbe des ersten Drachen, getrennt durch ein Komma (z. B.
Smaug,red) - 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:
namedes ersten Drachencolordes ersten Drachennamedes zweiten Drachencolordes zweiten Drachenelementdes ersten Drachen (gemeinsam aus der Dragon-Klasse)elementdes zweiten Drachen (gemeinsam aus der Dragon-Klasse)worlddes 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 RealmBeachte, 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)
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