Menu
Coddy logo textTech

Has-A İlişkisi

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

Bu kurs boyunca, sınıflar arasında davranış paylaşmak için kalıtımı kullandın: Bir Dog, bir Animal'dır. Ancak kalıtım her zaman doğru araç değildir.

Bazen nesneler bir aile ağacını paylaşmaz; bunun yerine bir nesne basitçe başka bir nesneyi içerir. Buna composition denir ve “has-a” ilişkisini modeller.

Bir araba düşün. Araba bir motor türü değildir. Bir motoru vardır. Motor, arabanın içinde bulunan ayrı bir nesnedir:

local Engine = {}
Engine.__index = Engine

function Engine:new(horsepower)
    local obj = {horsepower = horsepower}
    setmetatable(obj, Engine)
    return obj
end

local Car = {}
Car.__index = Car

function Car:new(model, engine)
    local obj = {
        model = model,
        engine = engine  -- Engine nesnesini Car içinde sakla
    }
    setmetatable(obj, Car)
    return obj
end

Bir araba oluştururken, mevcut bir motor nesnesini onun oluşturucusuna aktarırsınız:

local myEngine = Engine:new(200)
local myCar = Car:new("Sedan", myEngine)

print(myCar.engine.horsepower)  -- 200

Araba motordan kalıtım almaz. Basitçe motora bir başvuru tutar. Bu, her iki sınıfı da bağımsız tutar. Farklı bir motor kullanabilir veya aynı motor sınıfını bir motosiklette kullanabilirsin.

Composition, kalıtımın sağlayamadığı bir esneklik sunar: nesneleri katı bir aile hiyerarşisine kilitlemek yerine parçalardan bir araya getirirsiniz.

challenge icon

Görev

Kolay

Kompozisyon kullanarak bir bilgisayar sistemi oluşturalım! Kalıtım yerine, içinde bir Computer bulunan bir CPU oluşturacaksın: böylece "has-a" ilişkisini göstereceksin.

Kodunu üç dosyaya ayıracaksın:

  • CPU.lua: :new(brand, speed) kurucusuna sahip bir CPU sınıfı oluştur. Bu kurucu, marka adını ve GHz cinsinden hızı saklamalıdır. :getInfo() biçiminde bir dize döndüren bir {brand} @ {speed}GHz metodu ekle.
  • Computer.lua: :new(model, cpu) kurucusu bir model adını ve bir CPU nesnesini kabul eden bir Computer sınıfı oluştur. Computer, CPU nesnesini kendi içinde saklar (kompozisyon!). Bilgisayarın modelini ve CPU'sunun bilgilerini yazdıran bir :describe() metodu ekle.
  • main.lua: Her şeyi bir araya getir! CPU markası, CPU hızı ve bilgisayar modeli için girdileri oku. Önce bir CPU nesnesi oluştur, ardından bunu Computer kurucusuna aktar. Son olarak bilgisayarın :describe() metodunu çağır.

Üç girdi alacaksın:

  1. CPU markası (bir dize)
  2. GHz cinsinden CPU hızı (bir sayı)
  3. Bilgisayar modeli adı (bir dize)

Çıktın, içerdiği CPU'dan gelen bilgileri de içeren bilgisayar açıklamasını göstermelidir:

Model: {model}
CPU: {brand} @ {speed}GHz

Örneğin girdiler Intel, 3.5 ve WorkStation ise çıktı şöyle olmalıdır:

Model: WorkStation
CPU: Intel @ 3.5GHz

Computer'ın CPU'dan kalıtım almadığına dikkat et. Computer yalnızca bir CPU'ya referans tutar. Computer'ın :describe() metodu, saklanan nesne üzerinden CPU'nun verilerine erişir; bu da kompozisyonun daha basit parçalardan karmaşık nesneler oluşturmanı nasıl sağladığını gösterir!

Kendin dene

-- main.lua
-- Kompozisyon kullanarak her şeyi bir araya getir

local CPU = require('CPU')
local Computer = require('Computer')

-- Girdileri oku
local cpuBrand = io.read()
local cpuSpeed = tonumber(io.read())
local computerModel = io.read()

-- TODO: Marka ve hız ile bir CPU nesnesi oluştur

-- TODO: Model ve CPU nesnesi ile bir Computer nesnesi oluştur

-- TODO: Çıktıyı yazdırmak için computer'ın describe() metodunu çağır
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