Lua-sheriffen, del 5- Objekt

Nu är det återigen dags för ett avsnitt av…

Lua-sheriffen

Förra gången gick vi igenom funktioner, så det känns rätt naturligt att följa upp detta med objekt och metoder!

Objektorientering kanske inte är den viktigaste delen av Lua i och med att det till stor del används som ett skriptspråk, men vi går igenom det då det kan vara bra att använda sig av i vissa fall.

Kort repetition

Om du inte läst våra tidigare inlägg om programmering i Python, så är objektorientering ett sätt att representera exempelvis ett föremål programmatiskt. Ta som exempel en bil, som kan attribut som motor, antal hjul, bränsletyp med mera. Vissa av dessa attribut kanske är synliga för användaren, medan andra är dolda. Bilen har också metoder, sätt för användaren att interagera med den. Exempel på en metod skulle kunna vara ”tanka()” eller ”starta()”.
När objektet väl är definierat kan man skapa så många kopior av det man vill, ungefär som att man kan bygga precis hur många bilar man vill när man väl har en färdig ritning. Dessa kopior är av samma typ, men de är fristående från varandra.

Att definiera objektet

Hur gör man då för att skapa objektet med attribut och metoder, och för att bestämma vad användaren kan göra med det och inte?

Man skulle kunna skapa en table och lägga in funktioner i denna. Dessa funktioner skulle då anropas med table.funktion(argument). Men gör man operationer på table med argument blir detta inget äkta objekt, så det går inte smidigt att skapa kopior av det som man ofta vill kunna göra inom objektorientering. Vi behöver också inkludera den instans av objektet som funktionen ska arbeta på, vilket i exempelvis Python kallas ‘self’. Vi kan använda samma namn i våra exempel för att förenkla, så här är ett enkelt bilobjekt och två instanser:

Smidigt? Nja. Som synes behöver vi i detta fallet sätta alla metoder och attribut manuellt för att det ska fungera korrekt. Hade vi skrivit ”a = Car” så hade alla operationer skett på grundobjektet istället.

För att lösa det hela smidigare kan vi skapa en klass och låta instanserna ha basklassen som sin ”meta table”. Detta innebär att om man har ett objekt a av typen Car, och man exempelvis skriver a:start(), kommer Lua först att kolla om a har en metod start(). Finns den inte där, kollar språket istället i Car, som är meta table. Och där finns den.

Hur sätter man då metatable? Jo, så här:

Sen vill vi enkelt kunna skapa nya instanser av Object där instanserna automatiskt vet var de ska hämta sina metoder. Låt oss omdefiniera Car, med en konstruktor:

Som synes har jag här valt att lägga metoderna direkt i tablen, vilket fungerar lika bra som att lägga in dem efteråt (och då skriva function Account:metod() istället).

Här går det också bra att specificera attribut, eller helt enkelt skriva över metoder, både när man anropar konstruktorn och när som helst efteråt.

Arv

Lite kort om arv till underklasser också. Om man har ett objekt, och vill skapa underobjekt som har samma funktionalitet/attribut men som kanske bygger vidare på den, är det i nuläget väldigt enkelt att göra i Lua. Man skriver helt enkelt så här:

Här skapar vi den nya klassen Ferrari, lägger till ett attribut ”color” och skapar en metod för att hämta färgen. Det går såklart också att skriva över gamla metoder, om man t.ex. vill skriva ut ”VROOOOM!” istället för ”Bilen är startad.” när man startar en Ferrari. 🙂

Ingen kan väl direkt påstå att det här med objekt är särskilt smidigt i Lua, men nu har vi i alla fall tittat lite på hur man kan göra!

Så vad har vi lärt oss idag?

  • Att objekt i Lua egentligen är tables fulla med data
  • Att objekt och instanser inte är jättesmidiga att jobba med i det här språket
  • Vilka beståndsdelar ett objekt har
  • Hur man skapar objekt, instanser, och underklasser
  • Hur man kan modifiera funktionaliteten och attribut på både underklasser och enstaka instanser

Slutet gott, allting gott! Nästa gång ska vi titta på aritmetik och logik i Lua! 🙂

Kommentera