Metotları geçersiz kılma
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 23 / 57.
Bir alt sınıf, aynı ada sahip bir yöntem tanımlayarak bir yöntemi geçersiz kılabilir. Ruby, önce nesnenin kendi sınıfındaki yöntemi, ancak ondan sonra üst sınıftaki yöntemi arar; bu nedenle alt sınıfın sürümü kullanılır:
class Animal
def speak
"..."
end
end
class Dog < Animal
def speak
"Woof"
end
end
class Fish < Animal
end
puts Dog.new.speak
puts Fish.new.speakÇıktı:
Woof
...Başka bir metodu çağıran bir üst sınıf metodu, alt sınıf nesneleri için geçersiz kılınmış sürümü kullanır. Ortak metot bir kez yazılır ve her alt sınıf yalnızca farklı olan kısmı değiştirir:
class Animal
def initialize(name)
@name = name
end
def introduce
"#{@name} says #{speak}"
end
def speak
"..."
end
end
class Cat < Animal
def speak
"Meow"
end
end
puts Cat.new("Tom").introduce
puts Animal.new("Thing").introduceÇıktı:
Tom says Meow
Thing says ...Bir alt sınıfta to_s metodunu geçersiz kılmak, yalnızca o alt sınıfın nasıl yazdırılacağını değiştirir. Geçersiz kılmadığı metotlar üst sınıftan gelmeye devam eder:
class Item
def initialize(name, price)
@name = name
@price = price
end
def to_s
format("%s %.2f", @name, @price)
end
end
class SaleItem < Item
def to_s
format("%s %.2f (sale)", @name, @price * 0.8)
end
end
puts Item.new("Lamp", 20)
puts SaleItem.new("Lamp", 20)Çıktı:
Lamp 20.00
Lamp 16.00 (sale)Ruby'nin arama yaptığı sıra, sınıfın ata sınıflarıdır: önce sınıfın kendisi, ardından üst sınıfı ve böylece Object sınıfına kadar devam eder. Listedeki yöntemi tanımlayan ilk sınıf, bu yöntemi sağlar:
class Animal
def speak
"..."
end
end
class Dog < Animal
def speak
"Woof"
end
end
class Puppy < Dog
end
puts Puppy.new.speak
p Puppy.ancestors.take(3)Çıktı:
Woof
[Puppy, Dog, Animal]Görev
KolayBordro sınıflarını tamamla. Employee, bir name saklar ve pay(hours) metoduna sahiptir; bu metot hours * 20 döndürür. Ayrıca payslip(hours) metodu pay kullanarak Ada: 800 döndürür. Manager, saat sayısı ne olursa olsun sabit 1500 döndürecek şekilde pay metodunu geçersiz kılar. Intern, pay metodunu hours * 12 döndürecek şekilde geçersiz kılar, ancak sonuç en fazla 300 olur. payslip yalnızca Employee içinde tanımlanır.
Sağlanan kod; employee Ada 40, manager Bo 50 veya intern Cy 20 satırlarını okur, eşleşen nesneyi oluşturup bordrosunu yazdırır ve ardından toplam ücreti yazdırır.
Kodunu employee.rb, manager.rb ve intern.rb dosyalarına yaz. main.rb, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'employee'
require_relative 'manager'
require_relative 'intern'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
kinds = { "employee" => Employee, "manager" => Manager, "intern" => Intern }
total = 0
input.each do |line|
kind, name, hours = line.split
worker = kinds[kind].new(name)
puts worker.payslip(hours.to_i)
total += worker.pay(hours.to_i)
end
puts "total: #{total}"
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
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıf TanımlamaÖrnek DeğişkenleriMetotlar ve selfto_s ve inspectÖzet - Kütüphane Kartı7Çok Biçimlilik ve Ördek Tiplemesi
Çok BiçimlilikÖrdek TiplemesiSoyut Metotlarcase ve SınıflarTekrar - Ödeme Yöntemleri2Erişimciler ve self
Okuyucular ve YazıcılarÖzel Setter'larMetotlarda selfKimlik ve EşitlikTekrar - Kişi Listesi5Kalıtım
Alt sınıflarMetotları geçersiz kılmasuper çağrısıis_a? ve üst sınıflarTekrar - Personel Maaşları8Özel Metotlar
Eşitlik ve hashOperatör Metotlarıİndeksleme ve EklemeÖzel KoleksiyonlarTekrar - Kesirler11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Sınıf Metotları ve Değişkenleri
Sınıf MetotlarıSınıf Örnek DeğişkenleriSabitlerFabrika MetotlarıTekrar - Kupon KodlarıKendi başına pratik yap: Online Ruby derleyicisi