Penggantian Metode dan Polimorfisme
Ganti metode induk dan capai dispatch polimorfik saat runtime.
Penggantian Metode dan Polimorfisme adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.
Penimpaan Metode
Kelas anak menimpa metode induk dengan mendefinisikan metode bernama sama. Saat dipanggil pada instans anak, versi anak akan dijalankan. Versi induk tetap dapat diakses melalui Parent.method(self).
local Shape={} Shape.__index=Shape
function Shape:area() return 0 end
function Shape:describe() print(type(self).." area="..self:area()) end
local Circle={} Circle.__index=Circle
setmetatable(Circle,{__index=Shape})
function Circle.new(r) return setmetatable({r=r},Circle) end
function Circle:area() return math.pi*self.r^2 end
local Square={} Square.__index=Square
setmetatable(Square,{__index=Shape})
function Square.new(s) return setmetatable({s=s},Square) end
function Square:area() return self.s^2 end
Circle.new(5):describe()
Square.new(4):describe()Pemanggilan Polimorfik
Polimorfisme berarti berbagai jenis objek merespons pesan yang sama dengan cara berbeda. Fungsi yang menerima bentuk apa pun dan memanggil :area() dapat bekerja untuk jenis bentuk apa pun—masing-masing merespons dengan implementasinya sendiri.
local shapes={
Circle.new(3),
Square.new(4),
Circle.new(1),
}
local total=0
for _,shape in ipairs(shapes) do
total=total+shape:area()
end
print(string.format("Total area: %.2f",total))Pengetikan Bebek
Lua menggunakan pengetikan bebek: jika sebuah objek memiliki metode tersebut, objek itu dapat digunakan. Tidak diperlukan deklarasi antarmuka formal. Fungsi yang memanggil :speak() dapat bekerja dengan objek apa pun yang memiliki metode speak, tanpa memedulikan kelasnya.
local function makeNoise(obj)
if type(obj.speak)=="function" then
obj:speak()
else
print("(silent)")
end
end
local Duck={speak=function(self) print("Quack!") end}
local Robot={speak=function(self) print("Beep boop!") end}
local Rock={}
makeNoise(Duck) -- Quack!
makeNoise(Robot) -- Beep boop!
makeNoise(Rock) -- (silent)Polimorfisme Operator
Metametode seperti __add memungkinkan polimorfisme untuk operator. Berbagai jenis dapat merespons + dengan semantiknya sendiri selama mendefinisikan __add.
local Vec2={} Vec2.__index=Vec2
Vec2.__add=function(a,b) return Vec2.new(a.x+b.x,a.y+b.y) end
Vec2.__tostring=function(v) return "("..v.x..","..v.y..")" end
function Vec2.new(x,y) return setmetatable({x=x,y=y},Vec2) end
local Color={} Color.__index=Color
Color.__add=function(a,b)
return Color.new(math.min(255,a.r+b.r),math.min(255,a.g+b.g),math.min(255,a.b+b.b))
end
function Color.new(r,g,b) return setmetatable({r=r,g=g,b=b},Color) end
print(tostring(Vec2.new(1,2)+Vec2.new(3,4))) -- (4,6)Pola Pengunjung
Pola pengunjung memisahkan operasi dari objek. Sebuah operasi “mengunjungi” objek dari berbagai jenis dan memanggil metode yang sesuai berdasarkan jenisnya. Gunakan pola ini untuk operasi yang perlu berbeda menurut jenis tanpa mengubah jenis objek tersebut.
local function printInfo(obj)
local mt = getmetatable(obj)
if mt == Circle then
print(string.format("Circle r=%.1f area=%.2f",obj.r,obj:area()))
elseif mt == Square then
print(string.format("Square s=%.1f area=%.2f",obj.s,obj:area()))
end
end
for _,s in ipairs({Circle.new(3),Square.new(4)}) do
printInfo(s)
endTabel Antarmuka
Definisikan antarmuka sebagai tabel berisi nama-nama metode. Validasi bahwa objek mengimplementasikan semua metode yang diperlukan sebelum menggunakannya secara polimorfik.
local function implements(obj, interface)
for _, method in ipairs(interface) do
if type(obj[method]) ~= "function" then
return false, "missing: "..method
end
end
return true
end
local Drawable = {"draw","resize","move"}
local Widget = {
draw=function(self) print("draw "..self.type) end,
resize=function(self,w,h) self.w,self.h=w,h end,
move=function(self,x,y) self.x,self.y=x,y end,
type="button"
}
local ok,err = implements(Widget,Drawable)
print(ok,err) -- true nilPemeriksaan Keberadaan Metode
Sebelum memanggil metode opsional secara polimorfik, periksa apakah objek memilikinya. Dengan begitu, kemampuan opsional dapat digunakan tanpa memerlukan kelas dasar bersama.
local function maybeUpdate(obj, dt)
if type(obj.update)=="function" then
obj:update(dt)
end
end
local objects={
{x=0,y=0,update=function(self,dt) self.x=self.x+10*dt end},
{x=0,y=0}, -- no update
{x=0,y=0,update=function(self,dt) self.y=self.y+5*dt end},
}
for _,o in ipairs(objects) do maybeUpdate(o,1) end
for _,o in ipairs(objects) do print(o.x,o.y) endTabel Pemanggilan Berbasis Jenis
Alih-alih rangkaian if/elseif, gunakan tabel pemanggilan: petakan nama jenis ke fungsi penangan. Ini adalah pola polimorfisme berbasis tabel.
local handlers={
number = function(v) return "num:"..v end,
string = function(v) return "str:\"".."..v.."\"" end,
boolean = function(v) return "bool:"..(v and "T" or "F") end,
table = function(v) return "tbl:#"..tostring(#v) end,
}
local function describe(v)
local h=handlers[type(v)]
return h and h(v) or "unknown"
end
print(describe(42))
print(describe("hello"))
print(describe({1,2,3}))Nilai Kembalian Kovarian
Metode kelas anak dapat mengembalikan jenis yang lebih spesifik daripada metode kelas induk (kembalian kovarian). Lua diketik secara dinamis, sehingga hal ini berlangsung alami—pabrik milik anak mengembalikan instans anak, bukan sekadar induk.
local Base={} Base.__index=Base
function Base.new() return setmetatable({type="base"},Base) end
function Base:copy() return Base.new() end
local Child={} Child.__index=Child
setmetatable(Child,{__index=Base})
function Child.new(extra)
local self=setmetatable({type="child"},Child)
self.extra=extra; return self
end
function Child:copy() return Child.new(self.extra) end -- covariant
local c=Child.new("hello")
local c2=c:copy()
print(c2.extra,getmetatable(c2)==Child) -- hello trueRingkasan Polimorfisme
Polimorfisme Lua dalam praktik: nama metode sama, perilaku berbeda untuk setiap jenis. Hal ini dicapai melalui OOP berbasis metatabel, pemeriksaan pengetikan bebek, atau tabel pemanggilan. Tidak diperlukan sistem antarmuka formal—cukup gunakan konvensi penamaan metode yang konsisten.
-- Three ways to achieve polymorphism:
-- 1. Metatable inheritance + method override
-- 2. Duck typing: just call it if it exists
-- 3. Dispatch table: map type -> handler
local function area(shape)
-- Duck typing approach:
assert(type(shape.area)=="function","needs area()")
return shape:area()
end
print(area({area=function() return 16 end})) -- 16Pertanyaan tentang Polimorfisme
Bagaimana cara kerja polimorfisme dalam Lua?
Ringkasan: Penimpaan dan Polimorfisme
Timpa metode induk dengan mendefinisikannya kembali di kelas anak. Lua menyelesaikan pemanggilan dari bawah ke atas melalui rantai __index, sehingga pemanggilan polimorfik saat program berjalan tercapai secara alami.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penggantian Metode dan Polimorfisme” gratis?
Ya — teks lengkap “Penggantian Metode dan Polimorfisme” 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 “Penggantian Metode dan Polimorfisme”?
Ganti metode induk dan capai dispatch polimorfik saat runtime. 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 4 dari 4.
Berapa lama pelajaran “Penggantian Metode dan Polimorfisme” 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