Menu
Coddy logo textTech

Metotları Geçersiz Kılma

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

Şimdiye kadar alt sınıflar, üst sınıf yöntemlerini miras aldı ve yenilerini ekledi. Peki ya bir alt sınıfın aynı yöntem adına ancak farklı davranışa ihtiyacı varsa? Buna yöntem geçersiz kılma denir.

Bir alt sınıfta, üst sınıftakilerden biriyle aynı ada sahip bir yöntem tanımladığınızda, alt sınıftaki sürüm öncelikli olur. Lua'nın arama zinciri önce alt sınıfı kontrol eder; yöntemi orada bulursa aramayı durdurur.

local Animal = {}
Animal.__index = Animal

function Animal:new(name)
    local obj = {name = name}
    setmetatable(obj, Animal)
    return obj
end

function Animal:speak()
    print(self.name .. " makes a sound")
end

-- Dog, speak() metodunu geçersiz kılar
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

function Dog:new(name)
    local obj = Animal.new(Animal, name)
    setmetatable(obj, Dog)
    return obj
end

function Dog:speak()
    print(self.name .. " barks: Woof!")
end

Artık her sınıf aynı yöntem çağrısına farklı yanıt veriyor:

local generic = Animal:new("Creature")
local buddy = Dog:new("Buddy")

generic:speak()  -- Çıktı: Creature bir ses çıkarır
buddy:speak()    -- Çıktı: Buddy havlar: Woof!

Dog örnekleri için Dog'un :speak() yöntemi, üst sınıfın sürümünün tamamen yerini alır. Bu, tutarlı bir arayüzü korurken özelleştirilmiş davranış oluşturmanı sağlar: her hayvan :speak() kullanabilir, ancak her tür bunu farklı şekilde yapar.

challenge icon

Görev

Kolay

Farklı yaratıkların kendilerine özgü şekillerde konuştuğu küçük bir hayvanlar âlemi oluşturalım! Bir Animal üst sınıfı ve her biri üst sınıfın Cat metodunu kendi özel davranışıyla geçersiz kılan iki alt sınıf, Cow ve :speak(), oluşturacaksın.

Kodunu dört dosyaya ayıracaksın:

  • Animal.lua: Hayvanın adını saklayan bir :new(name) kurucusuna sahip temel sınıfın. Hayvanın adının ardından :speak() yazdıran bir makes a sound metodu ekle. Bu, alt sınıfların geçersiz kılacağı varsayılan davranıştır.
  • Cat.lua: Animal'dan kalıtım alan bir alt sınıf. :new(name) kurucusu üst sınıfın kurucusunu çağırmalı, ardından metatablosunu Cat'e yeniden bağlamalıdır. :speak() metodunu, kedilerin farklı bir şey söylemesini sağlayacak şekilde geçersiz kıl: kedinin adının ardından meows: Meow! yazdır.
  • Cow.lua: Animal'dan kalıtım alan başka bir alt sınıf. Kurucuyu Cat ile aynı şekilde oluştur. :speak() metodunu, ineklerin adlarının ardından moos: Moo! yazdırmasını sağlayacak şekilde geçersiz kıl.
  • main.lua: Her şeyi bir araya getir! Girdiden iki ad oku, ilk adla bir Cat ve ikinci adla bir Cow oluştur, ardından aynı metodun sınıfa bağlı olarak farklı çıktılar ürettiğini göstermek için her birinde :speak() çağır.

İki girdi alacaksın:

  1. Kedinin adı
  2. İneğin adı

Ana dosyanda her iki hayvanı oluştur ve önce kedi, ardından inek üzerinde :speak() çağır.

Örneğin girdiler Whiskers ve Bessie ise çıktı şöyle olmalıdır:

Whiskers meows: Meow!
Bessie moos: Moo!

Her iki hayvanın da aynı :speak() metodu çağrısına yanıt verdiğine, ancak her birinin kendi türüne özgü çıktı ürettiğine dikkat et. Cat'in sürümü, üst sınıfın genel "ses çıkarır" davranışının tamamen yerine geçer; Cow'un sürümü de aynı şekilde davranır. İşte eylem hâlindeki metod geçersiz kılma: aynı arayüz, farklı uygulamalar!

Kendin dene

-- main.lua: Her şeyi bir araya getir

local Cat = require('Cat')
local Cow = require('Cow')

-- Girdiyi oku
local catName = io.read()
local cowName = io.read()

-- TODO: İlk isimle bir Cat oluştur

-- TODO: İkinci isimle bir Cow oluştur

-- TODO: Önce cat üzerinde :speak() çağır, sonra cow üzerinde
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