Örnek Değişkenleri
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 12 / 70.
Nesnelerin kendi iç verilerini nasıl yönettiğine odaklanan yeni bir bölüme hoş geldin. Sınıflar ve örnekler oluşturmayı öğrendin: şimdi her örneğin kendine özgü durumunu nasıl depoladığını ve yönettiğini keşfetme zamanı.
Örnek değişkenleri, yalnızca tek bir nesneye ait olan alanlardır. Bir yöntem veya oluşturucu içinde self.something ifadesine bir değer atadığında, bu veri yalnızca o belirli örnekte bulunur. Aynı sınıftaki diğer nesnelerin kendilerine ait ayrı kopyaları vardır.
Bu, tablolar gibi karmaşık verileri depolarken özellikle önemli hâle gelir. Her karakterin farklı öğeler taşıdığı bir envanter sistemini ele alalım:
local Inventory = {}
Inventory.__index = Inventory
function Inventory:new()
local instance = {}
setmetatable(instance, self)
instance.items = {} -- Her örnek kendi boş tablosunu alır
return instance
end
function Inventory:addItem(item)
table.insert(self.items, item)
endTemel satır instance.items = {} satırıdır. Yapıcı içinde yeni ve boş bir tablo oluşturarak her envanter nesnesinin kendine ait ayrı bir liste almasını sağlarsın. Bunun yerine items öğesini sınıf tablosunun kendisinde tanımlasaydın, tüm örnekler yanlışlıkla aynı tabloyu paylaşırdı: bir karaktere kılıç eklemek onu herkese verirdi!
local bag1 = Inventory:new()
local bag2 = Inventory:new()
bag1:addItem("Sword")
bag2:addItem("Potion")
print(#bag1.items) -- Çıktı: 1
print(#bag2.items) -- Çıktı: 1Her envanter kendi koleksiyonunu korur. Bu örüntü, bir örneğin bağımsız olarak değişen verileri izlemesi gerektiğinde geçerlidir: listeler, sayaçlar veya o nesneye özgü herhangi bir değiştirilebilir durum.
Görev
KolayHer cart kendi ayrı ürün listesini koruyacak bir ShoppingCart sistemi oluşturalım. Bu, instance değişkenlerinin verileri nesneler arasında nasıl yalıttığını gösterecek: bir cart'a items eklemek diğerini etkilemeyecek!
Code'unuzu iki dosya arasında düzenleyeceksiniz:
ShoppingCart.lua: Her instance'ın kendiproductstablosuna sahip olduğuShoppingCartclass'ını tanımlayın. Şunları ekleyin:- Her cart için empty bir products listesi başlatan
:new()constructor'ı - Bu cart'ın listesine bir product ekleyen
:addProduct(productName)method'u - Her product'ı ayrı bir satıra yazdıran
:listProducts()method'u
- Her cart için empty bir products listesi başlatan
main.lua: ShoppingCart module'ünü require edin ve iki ayrı cart oluşturun. Bağımsız inventory'lerini koruduklarını kanıtlamak için her cart'a farklı products ekleyin.
Dört inputs alacaksınız:
- cart A'ya eklenecek ilk product
- cart A'ya eklenecek ikinci product
- cart B'ye eklenecek ilk product
- cart B'ye eklenecek ikinci product
main dosyanızda:
- İki shopping cart oluşturun:
cartAvecartB - İlk iki product'ı
cartA'ya ekleyin - Son iki product'ı
cartB'ye ekleyin Cart A:yazdırın, ardından cart A'nın products listesini yazdırınCart B:yazdırın, ardından cart B'nin products listesini yazdırın
Örneğin inputs Apple, Bread, Milk ve Eggs ise output şöyle olmalıdır:
Cart A:
Apple
Bread
Cart B:
Milk
EggsUnutmayın: önemli nokta, constructor içinde products değerini yeni bir empty tablo olarak başlatmaktır. Bu, tüm cart'lar arasında tek bir tabloyu paylaşmak yerine her cart instance'ının kendine ait ayrı bir liste almasını sağlar.
Kendin dene
-- ShoppingCart modülünü yükle
local ShoppingCart = require('ShoppingCart')
-- Girdileri oku
local product1 = io.read()
local product2 = io.read()
local product3 = io.read()
local product4 = io.read()
-- TODO: İki alışveriş sepeti oluştur: cartA ve cartB
-- TODO: product1 ve product2'yi cartA'ya ekle
-- TODO: product3 ve product4'ü cartB'ye ekle
-- TODO: "Cart A:" yazdır, ardından cartA'nın ürünlerini listele
-- TODO: "Cart B:" yazdır, ardından cartB'nin ürünlerini listele
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