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...")
endSekarang, 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.
Tantangan
MudahMari 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 mencetakMachine is operational. Jangan lupa menyiapkan__indexdan 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 menggunakansetmetatable(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 operationalBaris 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"
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Konsep "Self"
Tabel dengan Fungsi'self' EksplisitSintaks Titik DuaTitik vs Titik DuaRangkuman, Titik Bergerak4Proyek: Bank Digital
Penyiapan Proyekmethod Setoran7Polimorfisme & Overriding
Menimpa methodMemanggil method indukDuck TypingAntarmuka UmumMemeriksa TipeRingkasan: Peran Karyawan10Proyek: Pengelola Bentuk
Penyiapan Proyekclass Rectangleclass Circlemethod KelilingKumpulan BentukLuas TotalSaring Bentuk2Pola Prototype untuk class
Konsep PrototypeMenghubungkan dengan __indexKonstruktor :new()Menginisialisasi AtributInstans yang MandiriRangkuman: Pabrik Mobil5Pembebanan Operator dalam OOP
Menjumlahkan ObjekMengurangkan ObjekMenggabungkan ObjekMembandingkan Objek (<, >)Ulasan: Aritmetika Dompet8Enkapsulasi
Konvensi PenamaanClosure untuk PrivasiAkses melalui ClosureTabel Hanya-BacaLogika ValidasiRangkuman: Brankas Aman11Pola Desain (Ringan)
Fungsi FactoryTabel SingletonPola IteratorObserver (Listener)Rangkuman, Factory Logger3State dan Behavior pada object
Variabel InstansGetter methodSetter methodProperty TerhitungMemformat stringPemeriksaan KesetaraanRangkuman: Nilai Siswa6Dasar-Dasar Pewarisan
Menyiapkan PewarisanMewarisi methodMemperluas KonstruktorMenambahkan method untuk ChildSama vs UnikRangkuman: Hierarki BentukLatihan sendiri: Compiler Lua online