Menu
CoddyTech

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.

Şu hiyerarşiyi göz önünde bulundur:

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

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 Dog nesneleri arasında ortaktır

function Dog:new(name, breed)
    local obj = Animal.new(Animal, name)
    obj.breed = breed  -- Her nesneye özgü: her Dog nesnesinin kendine ait bir breed değeri vardır
    setmetatable(obj, Dog)
    return obj
end

Bir Dog örneği oluşturduğunda, bazı değerler doğrudan nesnenin üzerinde bulunurken diğerlerine arama zinciri üzerinden ulaşılır:

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 fark şudur: kurucularda obj öğesine 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

Creature ve Dragon sınıf sistemini oluşturarak verilerin bir kalıtım hiyerarşisi boyunca nasıl aktığını inceleyelim. Hangi özniteliklerin tüm örnekler arasında paylaşıldığını, hangilerinin ise her bir nesneye özgü olduğunu kendin göreceksin.

Kodunu üç dosyaya dağıtacaksın:

  • Creature.lua: Tüm yaratıkların paylaştığı world = "Fantasy Realm" sınıf düzeyinde ortak bir özniteliğe 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" sınıf düzeyinde ortak özniteliğini ekle. :new(name, color) oluşturucun önce ad için üst sınıfın 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 verilerle benzersiz veriler arasındaki farkı göstermek için özniteliklerini incele.

İki girdi alacaksın:

  1. Virgülle ayrılmış ilk ejderhanın adı ve rengi (ör. Smaug,red)
  2. Virgülle ayrılmış ikinci ejderhanın adı ve rengi (ör. Draco,gold)

Ana dosyanda iki ejderhayı da kendilerine ait ad ve renklerle oluştur. Ardından aşağıdaki bilgileri tam olarak bu sırayla yazdır:

  1. İlk ejderhanın name özniteliği
  2. İlk ejderhanın color özniteliği
  3. İkinci ejderhanın name özniteliği
  4. İkinci ejderhanın color özniteliği
  5. İlk ejderhanın element özniteliği (Dragon sınıfından paylaşılan)
  6. İkinci ejderhanın element özniteliği (Dragon sınıfından paylaşılan)
  7. İlk ejderhanın world özniteliği (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 özniteliklerinin her ejderha için farklı olduğuna (benzersiz örnek öznitelikleri), buna karşılık element ve world özniteliklerinin her ikisi için de 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 ortak özelliklerle kendilerine özgü özellikleri göster

local Dragon = require('Dragon')

-- İlk ejderha için girdiyi oku (ad,renk)
local input1 = io.read()
-- İkinci ejderha için girdiyi oku (ad,renk)
local input2 = io.read()

-- TODO: Adı ve rengi elde etmek için ilk girdiyi ayrıştır
-- İpucu: string.match işlevini "([^,]+),([^,]+)" deseniyle kullan

-- TODO: Adı ve rengi elde etmek için ikinci girdiyi ayrıştır

-- TODO: İlk ejderhayı adı ve rengiyle oluştur

-- TODO: İkinci ejderhayı adı ve rengiyle 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