0Pricing
Lua Academy · Pelajaran

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
end

Pemanggilan 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())  -- 7

Rantai 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 A

Menimpa 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  10

Pewarisan 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

  1. Pewarisan Tunggal dengan Chaining __index
  2. Memanggil Metode Induk dengan super
  3. Pola Mixin
  4. Penggantian Metode dan Polimorfisme
← Kembali ke Lua Academy