Menu
Coddy logo textTech

Paylaşılan ve Benzersiz

Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 35 / 70.

Kalıtımla çalışırken, her veri parçasının nerede bulunduğunu anlamak önemlidir. Bazı öznitelikler paylaşımlıdır: üst sınıfta tanımlanır ve tüm alt sınıflar tarafından erişilebilir. Diğerleri ise benzersizdir: özellikle alt sınıfta veya örnekte oluşturulur.

Bu hiyerarşiyi göz önünde bulundurun:

local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia"  -- Paylaşılan: sınıfta tanımlanmış

function Animal:new(name)
    local obj = {name = name}  -- Benzersiz: her örnekte saklanır
    setmetatable(obj, Animal)
    return obj
end
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark"  -- Tüm Dogs arasında paylaşılan

function Dog:new(name, breed)
    local obj = Animal.new(Animal, name)
    obj.breed = breed  -- Benzersiz: her Dog'un kendi breed'i vardır
    setmetatable(obj, Dog)
    return obj
end

Bir Dog örneği oluşturduğunuzda, bazı değerler doğrudan nesne üzerinde bulunurken diğerleri arama zinciri ü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 (lookup ile 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 özgüdür; sınıf tablolarında doğrudan tanımlanan alanlar ise o sınıfın ve alt sınıflarının tüm örnekleri arasında paylaşılır.

challenge icon

Görev

Kolay

Bir Creature ve Dragon sınıfı sistemi oluşturarak verilerin bir kalıtım hiyerarşisi boyunca nasıl aktığını inceleyelim. Tüm örnekler arasında hangi özniteliklerin paylaşıldığını ve her bir nesneye özgü olanların hangileri olduğunu doğrudan göreceksin.

Kodunu üç dosyaya ayıracaksın:

  • Creature.lua: Tüm yaratıkların paylaştığı world = "Fantasy Realm" ortak sınıf düzeyi özniteliğine sahip üst sınıfını tanımla. Yaratığın adını örnek özniteliği olarak saklayan bir :new(name) oluşturucusu ekle.
  • Dragon.lua: Creature sınıfından kalıtım alan alt sınıfını tanımla. Tüm ejderhaların paylaştığı element = "fire" ortak sınıf düzeyi özniteliğini ekle. :new(name, color) oluşturucun, ad için üst sınıf oluşturucusunu çağırmalı, ardından her ejderha için benzersiz bir örnek özniteliği olarak color eklemeli.
  • main.lua: İki farklı ejderha oluştur ve paylaşılan veriler ile benzersiz veriler arasındaki farkı göstermek için özniteliklerini incele.

İki girdi alacaksın:

  1. İlk ejderhanın adı ve rengi, virgülle ayrılmış olarak (ör. Smaug,red)
  2. İkinci ejderhanın adı ve rengi, virgülle ayrılmış olarak (ör. Draco,gold)

Ana dosyanda her iki ejderhayı kendi adları ve renkleriyle oluştur. Ardından aşağıdaki bilgileri tam olarak bu sırayla yazdır:

  1. İlk ejderhanın name değeri
  2. İlk ejderhanın color değeri
  3. İkinci ejderhanın name değeri
  4. İkinci ejderhanın color değeri
  5. İlk ejderhanın element değeri (Dragon sınıfından paylaşılan)
  6. İkinci ejderhanın element değeri (Dragon sınıfından paylaşılan)
  7. İlk ejderhanın world değeri (Creature sınıfından paylaşılan)

Örneğin girdiler Smaug,red ve Draco,gold ise çıktı şöyle olmalıdır:

Smaug
red
Draco
gold
fire
fire
Fantasy Realm

name ve color değerlerinin her ejderha için farklı olduğuna (benzersiz örnek öznitelikleri), element ve world değerlerinin ise her ikisi için aynı olduğuna (arama zinciri aracılığıyla bulunan paylaşılan sınıf öznitelikleri) dikkat et.

Kendin dene

-- main.lua: Ejderhalar oluştur ve paylaşılan ile benzersiz öznitelikleri göster

local Dragon = require('Dragon')

-- İlk ejderha için girdi oku (name,color)
local input1 = io.read()
-- İkinci ejderha için girdi oku (name,color)
local input2 = io.read()

-- TODO: name ve color değerlerini çıkarmak için ilk girdiyi ayrıştır
-- İpucu: string.match'i "([^,]+),([^,]+)" deseniyle kullan

-- TODO: name ve color değerlerini çıkarmak için ikinci girdiyi ayrıştır

-- TODO: name ve color ile ilk ejderhayı oluştur

-- TODO: name ve color ile ikinci ejderhayı oluştur

-- TODO: Aşağıdakileri sırayla yazdır:
-- 1. İlk ejderhanın adı
-- 2. İlk ejderhanın rengi
-- 3. İkinci ejderhanın adı
-- 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)
quiz iconKendini test et

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

Kendi başına pratik yap: Online Lua derleyicisi