Lua Academy · Lektion

Flerskiktsarv

Stöd djupa arvskedjor med korrekt delegering via __index.

Lektion 2 av 413 steg

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
end

Skapa 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 Woof

Kedja 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)
end

Anropa 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
end

Metodupplö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
end

Djupbegrä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))  -- true

Djupkopiering 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.

Gratis att börja

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

  1. Design av basklass och konstruktor
  2. Flerskiktsarv
  3. Mixin-sammansättning och gränssnittskontroller
  4. instanceof och typinspektion
← Tillbaka till Lua Academy