Lua Academy · Oppitunti

Monitasoinen perintä

Tukekaa syviä perintäketjuja asianmukaisella __index-delegoinnilla.

Oppitunti 2/413 vaihetta

Monitasoinen perintä on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Kertaus yksittäisestä perinnästä

Yksittäinen perintä toteutetaan asettamalla Child.__index = Parent. Metodihaku toimii näin: jos metodia ei löydy Child-luokasta, se etsitään Parent-luokasta __index-määrityksen kautta.

Luokkatehtaan laajentaminen perintää varten

Lisätkää perusluokkaan :extend()-metodi, joka luo emoluokkaan yhdistetyn aliluokan.

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

Aliluokan luominen

Luokaa Animal-luokasta periytyvä Dog-aliluokka, joka korvaa init-metodin ja lisää uusia metodeja.

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

Monitasoinen ketju

Laajentakaa Dog-luokkaa ja luokaa GuideDog — kolmikerroksinen perintäketju.

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

super-metodien kutsuminen

Kutsukaa super-metodia aina luokkaviitteen kautta, ei self-viitteen kautta, jotta vältätte loputtoman rekursion.

function Dog:init(name)
  Dog.super.init(self, name, "Woof")  -- explicit super call
end

Metodien ratkaisu­järjestys

Lua ratkaisee metodit alhaalta ylöspäin __index-ketjujen kautta. GuideDog → Dog → Animal → nil. Ensimmäinen löydetty metodi valitaan.

Metodien korvaaminen

Määrittäkää aliluokkaan samanniminen metodi sen korvaamiseksi. Kutsukaa super-metodia nimenomaisesti osittaisia korvauksia varten.

function Dog:speak()
  print(self.name .. " barks!")
  Dog.super.speak(self)  -- also call parent speak
end

Syvyysrajat

Hyvin syvät perintäketjut hidastavat metodihakua (jokainen taso lisää yhden __index-vaiheen). Suosikaa koostamista, jos tasoja on enemmän kuin 3–4.

Luokkajäsenyyden tarkistaminen

Käykää metataulukkojen ketju läpi tarkistaaksenne, kuuluuko instanssi tiettyyn luokkaan.

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

Syvä kopio luokka säilyttäen

Säilyttäkää instansseja syväkopioidessanne niiden metataulukko, jotta kopio on edelleen oikean luokan instanssi.

Milloin koostamista kannattaa suosia

Käyttäkää perintää aitoihin is-a-suhteisiin (Dog is-a Animal). Käyttäkää koostamista (komponenttitaulukoita) has-a-suhteisiin tai joustavaan toimintojen yhdistämiseen.

Perintää koskeva kysymys

Miten monitasoinen perintä toimii Luassa?

Kertaus: Monitasoinen perintä

Laajentakaa luokkatehdasta :extend()-metodilla, joka ketjuttaa __index-linkit. Kutsukaa super-metodia nimenomaisesti muodossa ClassName.super.method(self, ...). Tarkistakaa luokkajäsenyys käymällä metataulukkojen ketju läpi.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Monitasoinen perintä” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Monitasoinen perintä”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Monitasoinen perintä”?

Tukekaa syviä perintäketjuja asianmukaisella __index-delegoinnilla. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Monitasoinen perintä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Kantaluokan ja rakentajan suunnittelu
  2. Monitasoinen perintä
  3. Mixin-koostaminen ja rajapintojen tarkistus
  4. instanceof ja tyyppien introspektio
← Takaisin: Lua Academy