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!")
endSekarang 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.
Tantangan
MudahMari 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 diikutimakes 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 diikutimeows: Meow!Cow.lua: Class anak lainnya yang mewarisi dari Animal. Atur constructornya dengan cara yang sama seperti Cat. Timpa:speak()agar sapi mencetak namanya diikutimoos: 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:
- Nama kucing
- 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
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Konsep "Self"
Tabel dengan Fungsi'self' EksplisitSintaks Titik DuaTitik vs Titik DuaRangkuman, Titik Bergerak4Proyek: Bank Digital
Penyiapan Proyekmethod Setoran7Polimorfisme & Overriding
Menimpa methodMemanggil method indukDuck TypingAntarmuka UmumMemeriksa TipeRingkasan: Peran Karyawan10Proyek: Pengelola Bentuk
Penyiapan Proyekclass Rectangleclass Circlemethod KelilingKumpulan BentukLuas TotalSaring Bentuk2Pola Prototype untuk class
Konsep PrototypeMenghubungkan dengan __indexKonstruktor :new()Menginisialisasi AtributInstans yang MandiriRangkuman: Pabrik Mobil5Pembebanan Operator dalam OOP
Menjumlahkan ObjekMengurangkan ObjekMenggabungkan ObjekMembandingkan Objek (<, >)Ulasan: Aritmetika Dompet8Enkapsulasi
Konvensi PenamaanClosure untuk PrivasiAkses melalui ClosureTabel Hanya-BacaLogika ValidasiRangkuman: Brankas Aman11Pola Desain (Ringan)
Fungsi FactoryTabel SingletonPola IteratorObserver (Listener)Rangkuman, Factory Logger3State dan Behavior pada object
Variabel InstansGetter methodSetter methodProperty TerhitungMemformat stringPemeriksaan KesetaraanRangkuman: Nilai Siswa6Dasar-Dasar Pewarisan
Menyiapkan PewarisanMewarisi methodMemperluas KonstruktorMenambahkan method untuk ChildSama vs UnikRangkuman: Hierarki BentukLatihan sendiri: Compiler Lua online