Flerskiktsarv
Stöd djupa arvskedjor med korrekt delegering via __index.
Flerskiktsarv är en gratis lektion i Lua Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lua Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lua Academy innehåller totalt 4 lektioner.
Översikt över enkel arvshierarki
Enkel arvshierarki uppnås genom att ange Child.__index = Parent. Vid metoduppslagning: om metoden inte finns i Child letar Lua i Parent via __index.
Utöka klassfabriken för arv
Lägg till en :extend()-metod i basklassen som skapar en subklass kopplad till föräldern.
function Animal:extend()
local cls = {}
cls.__index = cls
setmetatable(cls, {__index = self})
cls.super = self
function cls:new(...)
local inst = setmetatable({}, cls)
if inst.init then inst:init(...) end
return inst
end
return cls
endSkapa en subklass
Skapa Dog som en subklass till Animal, åsidosätt init och lägg till nya metoder.
local Dog = Animal:extend()
function Dog:init(name)
Dog.super.init(self, name, "Woof")
self.tricks = {}
end
function Dog:learnTrick(trick)
self.tricks[#self.tricks+1] = trick
end
local d = Dog:new("Rex")
d:learnTrick("sit")
d:speak() -- Rex says WoofKedja med flera nivåer
Utöka Dog för att skapa GuideDog — en arvshierarki med tre nivåer.
local GuideDog = Dog:extend()
function GuideDog:init(name, owner)
GuideDog.super.init(self, name)
self.owner = owner
end
function GuideDog:guide()
print(self.name .. " guides " .. self.owner)
endAnropa super-metoder
Anropa alltid super via klassreferensen, inte via self, för att undvika oändlig rekursion.
function Dog:init(name)
Dog.super.init(self, name, "Woof") -- explicit super call
endMetodupplösningsordning
Lua löser upp metoder underifrån och upp genom kedjor av __index. GuideDog → Dog → Animal → nil. Den första träffen används.
Åsidosätta metoder
Definiera en metod med samma namn i subklassen för att åsidosätta den. Anropa super uttryckligen vid partiella åsidosättningar.
function Dog:speak()
print(self.name .. " barks!")
Dog.super.speak(self) -- also call parent speak
endDjupbegränsningar
Mycket djupa arvshierarkier gör metoduppslagningen långsammare (varje nivå lägger till ett __index-steg). Föredra komposition framför fler än 3–4 nivåer.
Kontrollera klasstillhörighet
Gå igenom metatabellskedjan för att kontrollera om en instans tillhör en klass.
local function isA(instance, cls)
local mt = getmetatable(instance)
while mt do
if mt == cls then return true end
mt = getmetatable(mt)
end
return false
end
print(isA(d, Dog)) -- true
print(isA(d, Animal)) -- trueDjupkopiering med bevarad klass
Bevara metatabellen när instanser djupkopieras, så att kopian fortfarande är en instans av rätt klass.
När komposition bör föredras
Använd arv för verkliga is-a-relationer (Dog is-a Animal). Använd komposition (komponenttabeller) för has-a-relationer eller flexibel blandning av beteenden.
Arvsfråga
Hur fungerar arv på flera nivåer i Lua?
Sammanfattning: Arv på flera nivåer
Utöka klassfabriken med en :extend()-metod som kedjar länkar via __index. Anropa super uttryckligen med ClassName.super.method(self, ...). Kontrollera klasstillhörighet genom att gå igenom metatabellskedjan.
Lär dig Lua med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 40
- Lektioner
- 159
Vanliga frågor
Är lektionen ”Flerskiktsarv” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lua Academy, inklusive ”Flerskiktsarv”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lua Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Flerskiktsarv”?
Stöd djupa arvskedjor med korrekt delegering via __index. Ni övar på Lua Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Lua Academy?
Du behöver inga förkunskaper. Utbildningen i Lua Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Flerskiktsarv”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Lua Academy-lektionen?
Ja. Varje Lua Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Design av basklass och konstruktor
- Flerskiktsarv
- Mixin-sammansättning och gränssnittskontroller
- instanceof och typinspektion