Lua Academy · Oppitunti

Kantaluokan ja rakentajan suunnittelu

Suunnitelkaa Class()-tehdas, joka määrittää metataulukot ja new()-rakentajat.

Oppitunti 1/413 vaihetta

Kantaluokan ja rakentajan suunnittelu on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/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.

Tavoite: uudelleenkäytettävä luokkatehdas

Haluamme Class()-funktion, joka palauttaa uuden luokkaobjektin asianmukaisella konstruktorilla, metodien haulla ja olio-ohjelmoinnin semantiikalla.

Luokkatehtaan runko

Tehdas luo luokkataulukon, jossa on metodien välitykseen käytettävä metataulukko.

local function Class()
  local cls = {}
  cls.__index = cls
  cls.__name = "AnonymousClass"
  function cls:new(...)
    local instance = setmetatable({}, cls)
    if instance.init then instance:init(...) end
    return instance
  end
  return cls
end

Luokan määrittäminen

Luokaa luokka, määrittäkää init (konstruktori) ja lisätkää metodit.

local Animal = Class()
Animal.__name = "Animal"
function Animal:init(name, sound)
  self.name = name
  self.sound = sound
end
function Animal:speak()
  print(self.name .. " says " .. self.sound)
end
local cat = Animal:new("Cat", "Meow")
cat:speak()  -- Cat says Meow

Konstruktorimalli

Konstruktori :new(...) luo instanssin kutsulla setmetatable({}, cls) ja kutsuu sen jälkeen alustusta varten :init(...)-metodia. Näin varaaminen ja alustaminen erotetaan toisistaan.

Luokan nimi virheenkorjausta varten

Tallentakaa cls.__name ja määrittäkää __tostring, jotta instanssit tulostuvat havainnollisesti.

function Animal:__tostring()
  return "<" .. Animal.__name .. ": " .. self.name .. ">"
end
print(tostring(cat))  -- <Animal: Cat>

Oletusarvot init-metodissa

Antakaa init-metodissa oletusarvot käyttämällä or-operaattoria.

function Vehicle:init(opts)
  self.speed  = opts.speed  or 0
  self.fuel   = opts.fuel   or 100
  self.engine = opts.engine or "petrol"
end

Luokkametodit ja instanssimetodit

function cls.method()-määrittelyllä luodut metodit ovat luokkametodeja (niissä ei ole self-parametria). function cls:method()-määrittelyllä luodut metodit saavat instanssin self-parametrina.

Staattiset ominaisuudet

Suoraan luokkataulukkoon asetetut ominaisuudet ovat kaikkien instanssien yhteisiä, elleivät instanssikentät peitä niitä.

Animal.count = 0
function Animal:init(name, sound)
  Animal.count = Animal.count + 1
  self.name = name; self.sound = sound
end
print(Animal.count)  -- 0
Animal:new("Dog","Woof")
print(Animal.count)  -- 1

Kopioiva konstruktori

:clone()-metodi luo instanssista kopion kopioimalla sen kentät pinnallisesti.

function Animal:clone()
  local copy = setmetatable({}, getmetatable(self))
  for k, v in pairs(self) do copy[k] = v end
  return copy
end

Yhtäläisyysmetametodi

Määrittäkää __eq, jotta instanssien yhtäläisyysvertailut ovat mielekkäitä.

Animal.__eq = function(a, b)
  return a.name == b.name
end

Miksi ei rawget?

Käyttäkää self.field-viittausta (ei rawget-funktiota), jotta metaluokkien metametodiin perustuva kenttien käyttö säilyy mahdollisena. Käyttäkää rawget-funktiota vain, kun ohittaminen on nimenomaisesti tarpeen.

Konstruktorin suunnittelua koskeva kysymys

Miksi init kutsutaan erikseen new-varaajasta?

Kertaus: Perusluokka ja konstruktori

Class()-tehdas luo taulukon luokaksi, asettaa metodihakua varten __index = cls-määrityksen ja tarjoaa :new()- sekä :init()-metodit. Tämä muodostaa kaikkien Lua-olio-ohjelmointimallien perustan.

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 ”Kantaluokan ja rakentajan suunnittelu” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Kantaluokan ja rakentajan suunnittelu”. 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 ”Kantaluokan ja rakentajan suunnittelu”?

Suunnitelkaa Class()-tehdas, joka määrittää metataulukot ja new()-rakentajat. 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 1/4.

Kuinka kauan ”Kantaluokan ja rakentajan suunnittelu”-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