Memanggil method induk
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 38 dari 70.
Terkadang, mengganti method sepenuhnya bukanlah yang kamu inginkan. Sebaliknya, kamu mungkin ingin memperluas perilaku parent: lakukan yang dilakukan parent, lalu tambahkan sesuatu. Untuk melakukannya, kamu bisa memanggil method parent langsung dari dalam method yang ditimpa oleh child.
Teknik ini menggunakan sintaks titik dengan nama class induk, dengan meneruskan self secara eksplisit sebagai argumen pertama:
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 memperluas perilaku induknya
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()
Animal.speak(self) -- Panggil method induk terlebih dahulu
print(self.name .. " wags tail happily")
endBaris kuncinya adalah Animal.speak(self). Dengan menggunakan sintaks titik pada class induk dan meneruskan self secara manual, kita memanggil method asli sebelum menambahkan perilaku kita sendiri:
local buddy = Dog:new("Buddy")
buddy:speak()
-- output:
-- Buddy mengeluarkan suara
-- Buddy mengibaskan ekornya dengan gembiraPola ini berguna ketika method induk melakukan pekerjaan penting yang tidak ingin kamu duplikasi. Child dapat menjalankan logika milik induk terlebih dahulu, terakhir, atau bahkan di tengah kodemu sendiri, sehingga kamu punya kendali penuh atas cara perilaku digabungkan.
Tantangan
MudahMari kita buat sistem sapaan dengan FormalPerson yang memperluas perilaku Person biasa! Alih-alih sepenuhnya mengganti cara seseorang memperkenalkan diri, versi formalnya akan melakukan perkenalan standar terlebih dahulu, lalu menambahkan sentuhan sopan.
Kamu akan mengatur kodemu dalam tiga file:
Person.lua: class dasar dengan konstruktor:new(name)yang menyimpan nama orang tersebut. Sertakan method:introduce()yang mencetak nama orang tersebut diikutisays hi. Inilah perilaku dasar yang akan diperluas.FormalPerson.lua: class turunan yang mewarisi dari Person. Konstruktor class ini harus memanggil konstruktor induk untuk menangani nama. Override method:introduce(), tetapi alih-alih sepenuhnya mengganti perilaku induk, panggil method induk terlebih dahulu menggunakanPerson.introduce(self), lalu cetak baris tambahan yang berisi nama orang tersebut diikutibows politely.main.lua: Muat module FormalPerson dengan require, baca nama dari input, buat instance FormalPerson, lalu panggil:introduce()untuk melihat kedua perilaku digabungkan.
Kamu akan menerima satu input: nama orang tersebut.
Saat kamu memanggil :introduce() pada FormalPerson, program harus menghasilkan dua baris output: baris pertama dari method induk, baris kedua dari tambahan class turunan:
{name} says hi
{name} bows politelyContohnya, jika inputnya Eleanor, outputnya akan seperti ini:
Eleanor says hi
Eleanor bows politelyHal penting yang perlu dipahami adalah FormalPerson tidak menggandakan logika "says hi". Class ini menyerahkan tugas tersebut kepada method induk, lalu menambahkan perilaku uniknya sendiri. Dengan begitu, kodemu tetap rapi dan menunjukkan bagaimana class turunan dapat memperluas, bukan mengganti, fungsi induk!
Coba sendiri
-- main.lua: Titik awal untuk sistem sapaan
local FormalPerson = require('FormalPerson')
-- Baca nama orang tersebut dari input
local name = io.read()
-- TODO: Buat instance FormalPerson dengan nama yang diberikan
-- TODO: Panggil method introduce pada instance FormalPerson
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