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ında, ancak bundan sonra üst sınıfta bir yöntem arar; bu nedenle alt sınıfın sürümü kazanı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 ü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 yazdırılma biçimini değiştirir. Geçersiz kılmadığı metotlar hâlâ üst sınıftan gelir:
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 sırası sınıfın atasallarıdır: sınıfın kendisi, ardından üst sınıfı ve bu şekilde Object sınıfına kadar devam eder. Bu listedeki yöntemi tanımlayan ilk sınıf, 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
KolayMaaş bordrosu sınıflarını tamamla. Employee bir name saklar ve hours * 20 döndüren pay(hours) ile pay kullanarak Ada: 800 döndüren payslip(hours) yöntemlerine sahiptir. Manager, saat sayısı ne olursa olsun sabit 1500 değeri döndürecek şekilde pay yöntemini geçersiz kılar. Intern, pay yöntemini hours * 12 döndürecek, ancak en fazla 300 olacak şekilde geçersiz kılar. payslip yalnızca Employee içinde tanımlıdır.
Sağlanan kod employee Ada 40, manager Bo 50 veya intern Cy 20 satırlarını okur, eşleşen nesneyi oluşturur ve maaş bordrosunu yazdırır; ardından toplam ödemeyi yazdırır.
Kodun employee.rb, manager.rb ve intern.rb dosyalarına yazılmalıdır. 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