Menu
CoddyTech

Menimpa method

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 37 dari 70.

Sejauh ini, child class telah mewarisi method dari parent class dan menambahkan method baru. Namun, bagaimana jika child class memerlukan nama method yang sama dengan perilaku berbeda? Ini disebut method overriding.

Saat kamu mendefinisikan method di class anak dengan nama yang sama seperti method di class induk, versi milik class anak yang akan digunakan. Rantai pencarian Lua memeriksa class anak terlebih dahulu. Jika method ditemukan di sana, pencarian berhenti.

local Animal = {}
Animal.__index = Animal

function Animal:new(name)
    local obj = {name = name}
    setmetatable(obj, Animal)
    return obj
end

function Animal:speak()
    print(self.name .. " makes a sound")
end

-- Dog menimpa speak()
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new(name)
    local obj = Animal.new(Animal, name)
    setmetatable(obj, Dog)
    return obj
end

function Dog:speak()
    print(self.name .. " barks: Woof!")
end

Sekarang setiap class merespons panggilan method yang sama dengan cara berbeda:

local generic = Animal:new("Creature")
local buddy = Dog:new("Buddy")

generic:speak()  -- output: Creature mengeluarkan suara
buddy:speak()    -- output: Buddy menggonggong: Woof!

:speak() milik Dog sepenuhnya menggantikan versi milik parent untuk instance Dog. Dengan begitu, kamu bisa membuat perilaku khusus sambil mempertahankan antarmuka yang konsisten: setiap hewan bisa :speak(), tetapi setiap spesies melakukannya dengan cara berbeda.

challenge icon

Tantangan

Mudah

Mari bangun kerajaan hewan kecil tempat berbagai makhluk berbicara dengan cara uniknya masing-masing! Kamu akan membuat class induk Animal dan dua class anak, Cat dan Cow, yang masing-masing menimpa :speak() milik induknya dengan perilaku khusus.

Kamu akan mengatur kodemu dalam empat file:

  • Animal.lua: Class dasar dengan constructor :new(name) yang menyimpan nama hewan. Sertakan method :speak() yang mencetak nama hewan diikuti makes a sound. Ini adalah perilaku bawaan yang akan ditimpa oleh class anak.
  • Cat.lua: Class anak yang mewarisi dari Animal. Constructor :new(name) harus memanggil constructor induk, lalu menghubungkan kembali metatable ke Cat. Timpa method :speak() agar kucing mengatakan sesuatu yang berbeda: cetak nama kucing diikuti meows: Meow!
  • Cow.lua: Class anak lainnya yang mewarisi dari Animal. Atur constructornya dengan cara yang sama seperti Cat. Timpa :speak() agar sapi mencetak namanya diikuti moos: Moo!
  • main.lua: Satukan semuanya! Baca dua nama dari input, buat Cat dengan nama pertama dan Cow dengan nama kedua, lalu panggil :speak() pada masing-masing untuk menunjukkan bahwa nama method yang sama menghasilkan output berbeda, tergantung pada class-nya.

Kamu akan menerima dua input:

  1. Nama kucing
  2. Nama sapi

Di file utama, buat kedua hewan dan panggil :speak() pada kucing terlebih dahulu, lalu pada sapi.

Misalnya, jika inputnya adalah Whiskers dan Bessie, outputnya adalah:

Whiskers meows: Meow!
Bessie moos: Moo!

Perhatikan bagaimana kedua hewan merespons pemanggilan method :speak() yang sama, tetapi masing-masing menghasilkan output khusus sesuai tipenya. Versi milik Cat sepenuhnya menggantikan perilaku umum induknya, "makes a sound", begitu pula versi milik Cow. Inilah method overriding: antarmuka yang sama, implementasi yang berbeda!

Coba sendiri

-- main.lua: Satukan semuanya

local Cat = require('Cat')
local Cow = require('Cow')

-- Baca input
local catName = io.read()
local cowName = io.read()

-- TODO: Buat Cat dengan nama pertama

-- TODO: Buat Cow dengan nama kedua

-- TODO: Panggil :speak() pada kucing terlebih dahulu, lalu pada sapi
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler Lua online