Pewarisan Tunggal dengan Chaining __index
Tetapkan class induk sebagai __index metatabel untuk mewarisi metode.
Pewarisan Tunggal dengan Chaining __index adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Rantai Prototipe
Pewarisan tunggal bekerja dengan menetapkan __index kelas anak ke kelas induk. Saat sebuah metode tidak ditemukan pada anak, Lua mencarinya pada induk. Inilah yang membentuk rantai prototipe.
local Base={}
Base.__index=Base
function Base.new() return setmetatable({},Base) end
function Base:greet() print("Hello from Base") end
local Child={}
Child.__index=Child
setmetatable(Child,{__index=Base}) -- Child inherits Base
function Child.new() return setmetatable({},Child) end
local c=Child.new()
c:greet() -- Hello from Base (inherited)Urutan Resolusi Metode
Saat memanggil metode pada instans: (1) cari di tabel instans, (2) cari di Child (melalui __index), (3) cari di Base (melalui __index metatabel milik Child). Kecocokan pertama yang ditemukan akan digunakan.
local Base={}
Base.__index=Base
function Base:who() print("I am Base") end
local Child={}
Child.__index=Child
setmetatable(Child,{__index=Base})
function Child:who() print("I am Child") end -- override
local b=setmetatable({},Base)
local c=setmetatable({},Child)
b:who() -- I am Base
c:who() -- I am Child (overrides)Mewarisi Konstruktor
Kelas anak dapat menggunakan kembali konstruktor induk dengan memanggilnya, atau mendefinisikan konstruktor sendiri yang memperluas inisialisasi milik induk.
local Animal={}
Animal.__index=Animal
function Animal.new(name,sound)
return setmetatable({name=name,sound=sound},Animal)
end
function Animal:speak() print(self.name..": "..self.sound) end
local Dog={}
Dog.__index=Dog
setmetatable(Dog,{__index=Animal})
function Dog.new(name)
local self = Animal.new(name,"Woof")
return setmetatable(self,Dog)
end
function Dog:fetch(item) print(self.name.." fetches "..item) end
local d=Dog.new("Rex")
d:speak(); d:fetch("ball")Memeriksa Leluhur
Telusuri rantai metatabel ke atas untuk memeriksa apakah kelas sebuah objek mewarisi kelas dasar tertentu. Beginilah cara instanceof bekerja dalam Lua.
local function instanceof(obj, cls)
local mt = getmetatable(obj)
while mt do
if mt == cls then return true end
mt = getmetatable(mt)
end
return false
endPemanggilan Super
Panggil versi induk dari metode yang ditimpa dengan mengaksesnya secara langsung melalui tabel kelas induk.
local Base={}
Base.__index=Base
function Base:init(x) self.x=x end
function Base:value() return self.x end
local Child={}
Child.__index=Child
setmetatable(Child,{__index=Base})
function Child:init(x,y)
Base.init(self,x) -- call parent
self.y=y
end
function Child:value() return Base.value(self)+self.y end
local c=setmetatable({},Child)
c:init(3,4)
print(c:value()) -- 7Rantai Mendalam
Bangun hierarki tiga tingkat: A → B → C. Pencarian metode menelusuri seluruh rantai hingga metode ditemukan.
local A={}
A.__index=A
function A:aMethod() print("A method") end
local B={}
B.__index=B
setmetatable(B,{__index=A})
function B:bMethod() print("B method") end
local C={}
C.__index=C
setmetatable(C,{__index=B})
local c=setmetatable({},C)
c:bMethod() -- from B
c:aMethod() -- from AMenimpa Bidang
Sebuah instans dapat menimpa bidang tingkat kelas dengan menetapkannya secara langsung. Bidang kelas tidak berubah — bidang tersebut hanya disembunyikan untuk instans itu.
local Creature={}
Creature.__index=Creature
Creature.hp=100
Creature.speed=10
function Creature.new()
return setmetatable({},Creature)
end
local fast=Creature.new()
fast.speed=20 -- override for this instance
local normal=Creature.new()
print(fast.speed,normal.speed,Creature.speed) -- 20 10 10Pewarisan Tingkat Kelas
Menetapkan setmetatable(Child, {__index=Parent}) membuat pencarian tingkat kelas diteruskan ke induk jika tidak ditemukan. Artinya, Child.classMethod() menemukan metode pada kelas induk jika metode tersebut tidak ditimpa.
local Vehicle={}
Vehicle.__index=Vehicle
Vehicle.maxSpeed=120
function Vehicle.describe() print("Vehicle") end
local Car={}
Car.__index=Car
setmetatable(Car,{__index=Vehicle})
Car.describe() -- Vehicle (inherited class method)
print(Car.maxSpeed) -- 120 (inherited class field)Rantai Inisialisasi
Untuk inisialisasi yang benar, konstruktor anak memanggil konstruktor induk agar keadaan induk disiapkan. Rangkai inisialisasi ke atas sepanjang hierarki.
local Base={}
Base.__index=Base
function Base:_init(name) self.name=name end
local Mid={}
Mid.__index=Mid
setmetatable(Mid,{__index=Base})
function Mid:_init(name,level)
Base._init(self,name)
self.level=level
end
local Top={}
Top.__index=Top
setmetatable(Top,{__index=Mid})
function Top.new(name,level,role)
local self=setmetatable({},Top)
Mid._init(self,name,level)
self.role=role
return self
end
local t=Top.new("Alice",5,"admin")
print(t.name,t.level,t.role)Kelas Dasar Abstrak
Buat kelas dasar dengan metode yang belum diimplementasikan dan menimbulkan galat. Subkelas harus menimpa metode-metode tersebut. Ini memberlakukan kontrak antarmuka dalam sistem tipe dinamis Lua.
local Serializer={}
Serializer.__index=Serializer
function Serializer:encode(data)
error(self._type.." must implement encode()",2)
end
function Serializer:decode(str)
error(self._type.." must implement decode()",2)
end
local JSONSerializer={_type="JSON"}
setmetatable(JSONSerializer,{__index=Serializer})
function JSONSerializer:encode(data)
return "{"..tostring(data.key).."}"
end
local j=setmetatable({_type="JSON"},JSONSerializer)
print(j:encode({key="val"}))Pertanyaan tentang Pewarisan
Apa yang memungkinkan pewarisan tunggal dalam Lua?
Ringkasan: Pewarisan Tunggal
Tetapkan setmetatable(Child, {__index = Parent}) untuk mewarisi metode. Rantai __index menyediakan delegasi otomatis. Timpa metode dengan mendefinisikannya di Child; panggil induk secara eksplisit dengan Parent.method(self).
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pewarisan Tunggal dengan Chaining __index” gratis?
Ya — teks lengkap “Pewarisan Tunggal dengan Chaining __index” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pewarisan Tunggal dengan Chaining __index”?
Tetapkan class induk sebagai __index metatabel untuk mewarisi metode. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Pewarisan Tunggal dengan Chaining __index” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pewarisan Tunggal dengan Chaining __index
- Memanggil Metode Induk dengan super
- Pola Mixin
- Penggantian Metode dan Polimorfisme