Menu
CoddyTech

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

Baris 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 gembira

Pola 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.

challenge icon

Tantangan

Mudah

Mari 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 diikuti says 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 menggunakan Person.introduce(self), lalu cetak baris tambahan yang berisi nama orang tersebut diikuti bows 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 politely

Contohnya, jika inputnya Eleanor, outputnya akan seperti ini:

Eleanor says hi
Eleanor bows politely

Hal 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
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