Paylaşılan ve Benzersiz
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 35 / 70.
Kalıtımla çalışırken, her bir veri parçasının nerede bulunduğunu anlamak önemlidir. Bazı öznitelikler paylaşılır—ebeveynde tanımlanır ve tüm alt sınıflar tarafından erişilebilir. Diğerleri ise benzersizdir—doğrudan alt sınıfta veya örnekte (instance) oluşturulur.
Şu hiyerarşiyi düşünün:
local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia" -- Paylaşılan: sınıf üzerinde tanımlanmış
function Animal:new(name)
local obj = {name = name} -- Benzersiz: her örnekte saklanır
setmetatable(obj, Animal)
return obj
endlocal Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark" -- Tüm Köpekler arasında paylaşılır
function Dog:new(name, breed)
local obj = Animal.new(Animal, name)
obj.breed = breed -- Benzersiz: her Köpeğin kendi cinsi vardır
setmetatable(obj, Dog)
return obj
endBir Dog örneği oluşturduğunuzda, bazı değerler doğrudan nesne üzerinde bulunurken diğerleri arama zinciri (lookup chain) üzerinden bulunur:
local rex = Dog:new("Rex", "German Shepherd")
-- Bu örneğe özgü (rex üzerinde saklanır)
print(rex.name) -- "Rex"
print(rex.breed) -- "German Shepherd"-- Paylaşılan (arama yoluyla bulundu)
print(rex.sound) -- "bark" (Dog'dan)
print(rex.kingdom) -- "Animalia" (Animal'dan)Temel ayrım: yapıcılarda obj'ye atanan alanlar her örneğe özeldir, doğrudan sınıf tablolarında tanımlanan alanlar ise o sınıfın ve alt sınıflarının tüm örnekleri arasında paylaşılır.
Görev
KolayBir Creature ve Dragon sınıf sistemi oluşturarak verilerin bir kalıtım hiyerarşisi içinde nasıl aktığını keşfedelim. Hangi özniteliklerin tüm örnekler arasında paylaşıldığını ve hangilerinin her bir nesneye özgü olduğunu ilk elden göreceksiniz.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Creature.lua: Tüm yaratıkların paylaştığıworld = "Fantasy Realm"şeklinde paylaşılan sınıf düzeyinde bir özniteliğe sahip ana sınıfınızı tanımlayın. Yaratığın adını bir örnek özniteliği olarak saklayan bir:new(name)yapıcı metodu (constructor) ekleyin.Dragon.lua: Creature sınıfından miras alan alt sınıfınızı tanımlayın. Tüm ejderhaların paylaştığıelement = "fire"şeklinde paylaşılan sınıf düzeyinde bir öznitelik ekleyin.:new(name, color)yapıcı metodunuz, isim için ana sınıf yapıcısını çağırmalı, ardından her ejderha için benzersiz bir örnek özniteliği olarakcoloreklemelidir.main.lua: İki farklı ejderha oluşturun ve paylaşılan ile benzersiz veriler arasındaki farkı göstermek için özniteliklerini inceleyin.
İki girdi alacaksınız:
- Virgülle ayrılmış ilk ejderhanın adı ve rengi (örneğin,
Smaug,red) - Virgülle ayrılmış ikinci ejderhanın adı ve rengi (örneğin,
Draco,gold)
Ana dosyanızda, her iki ejderhayı da ilgili isim ve renkleriyle oluşturun. Ardından aşağıdaki bilgileri tam olarak bu sırayla yazdırın:
- İlk ejderhanın
namebilgisi - İlk ejderhanın
colorbilgisi - İkinci ejderhanın
namebilgisi - İkinci ejderhanın
colorbilgisi - İlk ejderhanın
elementbilgisi (Dragon sınıfından paylaşılan) - İkinci ejderhanın
elementbilgisi (Dragon sınıfından paylaşılan) - İlk ejderhanın
worldbilgisi (Creature sınıfından paylaşılan)
Örneğin, girdiler Smaug,red ve Draco,gold ise çıktı şu şekilde olmalıdır:
Smaug
red
Draco
gold
fire
fire
Fantasy Realmname ve color değerlerinin her ejderha için nasıl farklı olduğuna (benzersiz örnek öznitelikleri), element ve world değerlerinin ise her ikisi için de nasıl aynı olduğuna (arama zinciri yoluyla bulunan paylaşılan sınıf öznitelikleri) dikkat edin.
Kopya kağıdı
Kalıtım hiyerarşilerinde, öznitelikler ya paylaşılan (sınıf tablosunda tanımlanan) ya da benzersiz (bireysel örneklerde saklanan) olabilir.
Paylaşılan öznitelikler doğrudan sınıf tablolarında tanımlanır ve metatablo arama zinciri aracılığıyla erişilir:
local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia" -- Tüm Hayvanlar arasında paylaşılanBenzersiz öznitelikler, yapılandırıcılarda örnek nesnesine (obj) atanır:
function Animal:new(name)
local obj = {name = name} -- Her örneğe özel
setmetatable(obj, Animal)
return obj
endAlt sınıflar, üst sınıf özniteliklerini miras alırken kendi paylaşılan özniteliklerine sahip olabilirler:
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark" -- Tüm Köpekler arasında paylaşılan
function Dog:new(name, breed)
local obj = Animal.new(Animal, name) -- Üst sınıf yapılandırıcısını çağır
obj.breed = breed -- Benzersiz alt sınıf özniteliği ekle
setmetatable(obj, Dog)
return obj
endÖzniteliklere erişim:
local rex = Dog:new("Rex", "German Shepherd")
-- Benzersiz (doğrudan rex üzerinde saklanır)
print(rex.name) -- "Rex"
print(rex.breed) -- "German Shepherd"
-- Paylaşılan (metatablo araması yoluyla bulunur)
print(rex.sound) -- "bark" (Dog sınıfından)
print(rex.kingdom) -- "Animalia" (Animal sınıfından)Kendin dene
-- main.lua: Ejderhalar oluşturun ve paylaşılan vs benzersiz nitelikleri gösterin
local Dragon = require('Dragon')
-- İlk ejderha için girişi oku (isim,renk)
local input1 = io.read()
-- İkinci ejderha için girişi oku (isim,renk)
local input2 = io.read()
-- TODO: İsim ve rengi çıkarmak için ilk girişi ayrıştırın
-- İpucu: "([^,]+),([^,]+)" deseniyle string.match kullanın
-- TODO: İsim ve rengi çıkarmak için ikinci girişi ayrıştırın
-- TODO: İsmi ve rengiyle ilk ejderhayı oluşturun
-- TODO: İsmi ve rengiyle ikinci ejderhayı oluşturun
-- TODO: Aşağıdakileri sırasıyla yazdırın:
-- 1. İlk ejderhanın ismi
-- 2. İlk ejderhanın rengi
-- 3. İkinci ejderhanın ismi
-- 4. İkinci ejderhanın rengi
-- 5. İlk ejderhanın elementi (Dragon sınıfından paylaşılan)
-- 6. İkinci ejderhanın elementi (Dragon sınıfından paylaşılan)
-- 7. İlk ejderhanın dünyası (Creature sınıfından paylaşılan)
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming 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şisi