Menu
CoddyTech

Menyiapkan Pewarisan

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 31 dari 70.

Sejauh ini, kamu telah membuat class tempat setiap object mencari method di satu tabel prototype. Namun, bagaimana jika kamu ingin satu class dibangun berdasarkan class lain? Di sinilah pewarisan berperan: class anak dapat mengakses semua yang ada di class induk sambil menambahkan fiturnya sendiri.

Hal penting yang perlu dipahami adalah bahwa tabel class itu sendiri dapat memiliki metatable. Ketika Lua tidak dapat menemukan sesuatu di class anak, Lua akan mencari di __index milik metatable class anak, yang menunjuk ke class induk.

-- class induk
local Animal = {}
Animal.__index = Animal

function Animal:new()
    local obj = {}
    setmetatable(obj, Animal)
    return obj
end

function Animal:breathe()
    print("Breathing...")
end

Sekarang, inilah pengaturan pewarisannya. Kita membuat class anak dan mengatur metatable-nya agar melihat ke induknya:

-- class turunan
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

Satu baris ini, setmetatable(Dog, {__index = Animal}), membuat hubungan pewarisan. Saat instance Dog memanggil method yang tidak ditemukan di Dog, Lua memeriksa Animal.

Rantai pencarian bekerja seperti ini: instance → Dog → Animal. Setiap langkah menggunakan __index untuk menemukan tabel berikutnya yang akan dicari. Dengan begitu, class anak otomatis mewarisi semua method dari class induk tanpa menyalinnya.

challenge icon

Tantangan

Mudah

Mari bangun hierarki pewarisan pertamamu! Kamu akan membuat hubungan class induk-anak yang sederhana, dengan class Machine sebagai basis dan class Robot yang mewarisi darinya.

Kamu akan mengatur kodemu dalam tiga file:

  • Machine.lua: Definisikan class indukmu dengan pola class standar. Sertakan konstruktor :new() dan method :status() yang mencetak Machine is operational. Jangan lupa menyiapkan __index dan mengembalikan class di akhir file.
  • Robot.lua: Definisikan class anak yang mewarisi dari Machine. Wajibkan module Machine, siapkan tabel Robot dengan __index-nya sendiri, dan buat hubungan pewarisan menggunakan setmetatable(Robot, {__index = Machine}). Sertakan konstruktor :new() yang membuat instance dengan Robot sebagai metatable-nya.
  • main.lua: Satukan semuanya dengan mewajibkan module Robot, membuat instance Robot, dan memanggil method :status() yang diwarisi.

Konsep utamanya adalah class Robot tidak mendefinisikan :status() sendiri. Class ini mewarisi method tersebut dari Machine melalui rantai metatable. Saat kamu memanggil :status() pada instance Robot, Lua akan mencari method itu di Robot terlebih dahulu. Jika tidak menemukannya, Lua akan mengikuti tautan __index ke Machine, tempat method tersebut ditemukan.

Outputmu seharusnya:

Machine is operational

Baris tunggal ini membuktikan bahwa pewarisan berfungsi. Robot berhasil mengakses method yang hanya didefinisikan di class induknya!

Coba sendiri

-- main.lua: Satukan semuanya

-- TODO: Muat module Robot dengan require

-- TODO: Buat instance Robot menggunakan Robot:new()

-- TODO: Panggil method :status() yang diwariskan pada instance robotmu
-- Ini seharusnya mencetak "Machine is operational"
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler Lua online