Bağımsız Örnekler
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 10 / 70.
Nesne yönelimli programlamanın önemli bir yönü, her örneğin kendi ayrı durumunu korumasıdır. Aynı sınıftan iki nesne oluşturduğunuzda, bunlar tamamen bağımsızdır: birini değiştirmek diğerini etkilemez.
Şu örneği göz önünde bulundurun:
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
-- İki ayrı sayaç oluştur
local counterA = Counter:new(10)
local counterB = Counter:new(5)
counterA:increment()
counterA:increment()
print(counterA.value) -- Çıktı: 12
print(counterB.value) -- Çıktı: 5Her iki sayaç da aynı Counter sınıfından gelse de counterA değerini artırmanın counterB üzerinde hiçbir etkisi yoktur. Her nesnenin, kendi örnek tablosunda depolanan kendine ait bir value alanı vardır.
Bu bağımsızlık, nesneleri kullanışlı kılan şeydir. Bir oyunda, her biri kendi sağlık ve skorunu takip eden düzinelerce oyuncu oluşturabilirsiniz. Her biri farklı bir bakiyeye sahip birden fazla banka hesabını yönetebilirsiniz.
Sınıf yapıyı ve davranışı tanımlar, ancak her örnek kendi verileriyle kendi hayatını yaşar.
Görev
KolayAynı sınıftan nesnelerin gerçekten birbirinden bağımsız yaşamlar sürdüğünü kanıtlayalım! Bir Wallet sınıfı oluşturacak ve iki ayrı cüzdan örneği yaratacaksın; ardından birindeki değişikliklerin diğerini etkilemediğini göstermek için bunları bağımsız olarak değiştireceksin.
Kodunu iki dosyaya ayıracaksın:
Wallet.lua: Standart kurucu kalıbıylaWalletsınıfını tanımla. Her cüzdan kendibalancedeğerini takip etmelidir. Şunları ekle:- Bu cüzdanı verilen miktarla başlatan
:new(startingBalance)kurucusu - Bakiyeyi artıran bir
:add(amount)metodu - Bakiyeyi azaltan bir
:spend(amount)metodu
- Bu cüzdanı verilen miktarla başlatan
main.lua: Wallet modülünü içe aktar ve iki ayrı cüzdan örneği oluştur. Bağımsız durumlarını koruduklarını göstermek için her biri üzerinde farklı işlemler gerçekleştir.
Dört girdi alacaksın:
- A cüzdanının başlangıç bakiyesi
- B cüzdanının başlangıç bakiyesi
- A cüzdanına eklenecek miktar
- B cüzdanından harcanacak miktar
Ana dosyanda:
- İlk başlangıç bakiyesiyle
walletAoluştur - İkinci başlangıç bakiyesiyle
walletBoluştur - Belirtilen miktarı
walletA'ya ekle - Belirtilen miktarı
walletB'den harca - Her iki bakiyeyi ayrı satırlarda yazdır
Son bakiyeleri tam olarak şu biçimde yazdır:
Wallet A: [balance]
Wallet B: [balance]Örneğin girdiler 100, 50, 25 ve 10 ise çıktı şöyle olmalıdır:
Wallet A: 125
Wallet B: 40A cüzdanına para eklemenin B cüzdanını değiştirmediğine ve B cüzdanından harcama yapmanın A cüzdanını etkilemediğine dikkat et: her örnek kendi ayrı bakiyesini korur.
Kendin dene
-- Wallet modülünü gerektir
local Wallet = require('Wallet')
-- Girdileri oku
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())
-- TODO: İlk başlangıç bakiyesiyle walletA oluştur
-- TODO: İkinci başlangıç bakiyesiyle walletB oluştur
-- TODO: Belirtilen miktarı walletA'ya ekle
-- TODO: Belirtilen miktarı walletB'den harca
-- TODO: Son bakiyeleri gerekli formatta yazdır
-- Format: "Wallet A: [balance]" ve "Wallet B: [balance]"
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil HiyerarşisiKendi başına pratik yap: Online Lua derleyicisi