Nastoletni
Programiści

Logo Nastoletnich Programistów

Obiektowość w Lua cz. 2 – dziedziczenie

Po ponad pół roku postanowiłem napisać kolejną część poradnika odnośnie obiektowości w języku Lua. Uważam, że jest to temat na tyle ciekawy, że wypada wytłumaczyć go każdemu, kto zastanawia się nad pójściem w stronę pisania aplikacji w języku Lua (np. przy pomocy silnika Corona). W tej części omówimy sobie dalszą rozbudowę naszego systemu klas i obiektów. Zapraszam do lektury. 🙂

Silnik Corona posiada odrobinę inne podejście do obiektowości, tak więc jeżeli planujesz pracować w tym silniku, to potraktuj ten poradnik jako czysto teoretyczne zrozumienie czym w języku Lua są klasy/obiekty. Praktycznego podejścia zawsze najlepiej uczyć się z poradników poświęconych konkretnie danemu silnikowi.

Z teoriopraktyki, jak lubię nazywać moje wstępne poradniki, płynnie przechodzimy do konkretnej praktyki. Z pewnością pamiętacie z pierwszej części mojego poradnika funkcję do „tworzenia” obiektu. Tym razem utworzymy sobie funkcję class, która będzie odpowiedzialna za utworzenie fundamentu naszej klasy. Dzięki niej, zgodnie z zasadą DRY (Don’t Repeat Yourself), nie będziemy musieli przy deklaracji każdej klasy pisać tego samego kodu. Umożliwi to nam nie tylko łatwe odizolowanie kodu związanego z samym tworzeniem spreparowanych metatablic od kodu faktycznych definicji klas, ale również łatwość wprowadzania zmian w samej konstrukcji naszej funkcji, co może okazać się pomocne w późniejszych poradnikach.

Nie musimy tym razem deklarować od nowa utworzenia tablicy i przypisania jej do indeksu, gdyż robi to za nas nasza funkcja. Jest to jednak troszeczkę za mało, bo pamiętajmy, że to dopiero metatablica. Do obiektu brakuje jej jeszcze metody create(). My jednak chcemy, aby nasza klasa miała możliwość utworzenia swojego obiektu, poprzez wywołanie jej jak zwykłej metody, czyli np. obiekt = Klasa().

Z tym kodem jesteśmy już w stanie wywołać obiekt naszej klasy poprzez obiekt = Klasa(). Oczywiście nic nie stoi nam na przeszkodzie, aby nasz konstruktor przyjmował jakieś parametry (obiekt = Klasa(param1, param2)). Trzeba jednak wtedy pamiętać o zadeklarowaniu odpowiedniej funkcji konstruktora.

No dobra, ale coś tam wspominałem o tym całym dziedziczeniu. Skoro tak, to wypadałoby jeszcze trochę tę naszą klasę uzupełnić.

Posiadając już funkcję class() rozbudowaną w taki sposób, jesteśmy w stanie z dużą dozą prawdopodobieństwa pisać przejrzysty i obiektowy kod w Lua. 🙂 Dla przykładu, utworzyłem klasę Combo, która tworzy nam listę z elementami do wyboru. Poniżej zamieszczam kod tej klasy oraz przykładowy kod do jej implementacji, razem z zrzutem ekranu prezentacji jak to wygląda w modyfikacji ComputerCraft w grze Minecraft.

Klasa Combo:

Implementacja:

Zrzut ekranu z działania:

I to by było na tyle. Mam nadzieję, że ten poradnik pomoże w zrozumieniu zawiłego, ale jednak, podejścia obiektowego w Lua. W razie wszelkich pytań, służę pomocą. Powodzenia w kodzeniu! 😉


Źródła:
https://www.lua.org/pil/13.4.1.html
http://lua-users.org/wiki/MetamethodsTutorial
http://lua-users.org/wiki/ObjectOrientationTutorial
http://lua-users.org/wiki/LuaClassesWithMetatable

Mikołaj Panecki

Full Stack Developer. Lubi pomagać innych w zrozumieniu programowania, ale też sam nie stroni od pomocy innych. Prowadzi mały kanał w serwisie YouTube.

Zobacz wszystkie posty tego autora →

Komentarze