0Pricing
Lua Academy · Pelajaran

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)
end

Tabel 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 nil

Pemeriksaan 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) end

Tabel 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 true

Ringkasan 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}))  -- 16

Pertanyaan 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

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