Instans yang Mandiri
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 10 dari 70.
Aspek penting dalam pemrograman berorientasi object adalah setiap instance memiliki state terpisahnya sendiri. Saat kamu membuat dua object dari class yang sama, keduanya sepenuhnya independen: perubahan pada salah satunya tidak memengaruhi yang lain.
Perhatikan contoh ini:
local Counter = {}
Counter.__index = Counter
function Counter:new(start)
local instance = {}
setmetatable(instance, self)
instance.value = start or 0
return instance
end
function Counter:increment()
self.value = self.value + 1
end
-- Buat dua penghitung terpisah
local counterA = Counter:new(10)
local counterB = Counter:new(5)
counterA:increment()
counterA:increment()
print(counterA.value) -- output: 12
print(counterB.value) -- output: 5Meskipun kedua counter berasal dari class Counter yang sama, menaikkan counterA tidak berpengaruh pada counterB. Setiap object memiliki field value sendiri yang disimpan di tabel instance-nya sendiri.
Kemandirian inilah yang membuat object berguna. Kamu bisa membuat puluhan pemain dalam gim, masing-masing melacak kesehatan dan skornya sendiri. Kamu bisa mengelola beberapa rekening bank, masing-masing dengan saldo yang berbeda.
class menentukan struktur dan perilaku, tetapi setiap instance memiliki kehidupannya sendiri dengan datanya sendiri.
Tantangan
MudahMari buktikan bahwa object dari class yang sama benar-benar memiliki kehidupannya masing-masing! Kamu akan membuat class Wallet dan membuat dua instance wallet yang terpisah, lalu mengubahnya secara terpisah untuk menunjukkan bahwa perubahan pada satu wallet tidak memengaruhi wallet lainnya.
Kamu akan menyusun kodemu dalam dua file:
Wallet.lua: Definisikan classWalletdengan pola constructor standar. Setiap wallet harus melacakbalance-nya sendiri. Sertakan:- Constructor
:new(startingBalance)yang menginisialisasi wallet dengan jumlah yang diberikan - Method
:add(amount)yang menambah balance - Method
:spend(amount)yang mengurangi balance
- Constructor
main.lua: Gunakan perintah require untuk memuat module Wallet dan membuat dua instance wallet yang terpisah. Lakukan operasi yang berbeda pada masing-masing untuk menunjukkan bahwa keduanya mempertahankan state yang terpisah.
Kamu akan menerima empat input:
- Balance awal untuk wallet A
- Balance awal untuk wallet B
- Jumlah yang akan ditambahkan ke wallet A
- Jumlah yang akan digunakan dari wallet B
Di file utamamu:
- Buat
walletAdengan balance awal pertama - Buat
walletBdengan balance awal kedua - Tambahkan jumlah yang ditentukan ke
walletA - Gunakan jumlah yang ditentukan dari
walletB - Cetak kedua balance pada baris yang terpisah
Cetak balance akhir dengan format persis berikut:
Wallet A: [balance]
Wallet B: [balance]Contohnya, jika inputnya adalah 100, 50, 25, dan 10, outputnya harus seperti berikut:
Wallet A: 125
Wallet B: 40Perhatikan bahwa menambahkan jumlah ke wallet A tidak mengubah wallet B, dan menggunakan jumlah dari wallet B tidak memengaruhi wallet A: setiap instance mempertahankan balance-nya sendiri secara terpisah.
Coba sendiri
-- Muat module Wallet dengan require
local Wallet = require('Wallet')
-- Baca input
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())
-- TODO: Buat walletA dengan saldo awal pertama
-- TODO: Buat walletB dengan saldo awal kedua
-- TODO: Tambahkan jumlah yang ditentukan ke walletA
-- TODO: Gunakan jumlah yang ditentukan dari walletB
-- TODO: Cetak saldo akhir dalam format yang diminta
-- Format: "Wallet A: [balance]" dan "Wallet B: [balance]"
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