super çağrısı
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 24 / 57.
Bir geçersiz kılma yöntemi içinde super, aynı yöntemin üst sınıftaki sürümünü çağırır. Alt sınıf, sonucu tekrarlamak yerine onun üzerine ekleme yapabilir:
class Greeter
def greet(name)
"Hello, #{name}"
end
end
class LoudGreeter < Greeter
def greet(name)
super.upcase + "!"
end
end
puts LoudGreeter.new.greet("Ada")Çıktı:
HELLO, ADA!En yaygın kullanım initialize yöntemidir: alt sınıf ek bir değer alır, ortak değerleri super(...) ile üst sınıfa aktarır ve kendine ait olanı saklar:
class Person
attr_reader :name, :age
def initialize(name, age)
@name = name
@age = age
end
end
class Student < Person
attr_reader :school
def initialize(name, age, school)
super(name, age)
@school = school
end
end
s = Student.new("Ada", 20, "MIT")
puts "#{s.name}, #{s.age}, #{s.school}"Çıktı:
Ada, 20, MITÜç biçim, aktardıkları şey bakımından farklıdır. Yalın super, geçerli yöntemin aldığı aynı bağımsız değişkenleri aktarır; super() hiçbir bağımsız değişken aktarmaz; super(a, b) ise tam olarak bunları aktarır:
class Base
def show(*args)
"Base got #{args.inspect}"
end
end
class Child < Base
def show(a, b)
[super, super(), super(b)].join(" | ")
end
end
puts Child.new.show(1, 2)Çıktı:
Base got [1, 2] | Base got [] | Base got [2]super yöntemin herhangi bir yerinde veya yalnızca bir koşul altında çalıştırılabilir. Alt sınıfın initialize yöntemi, üst sınıfınınkinden farklı bağımsız değişkenler alıyorsa, yalın super yanlış bağımsız değişkenleri geçirir ve bu da yaygın bir ArgumentError hatasına neden olur:
class Logger
def log(message)
puts "LOG #{message}"
end
end
class QuietLogger < Logger
def log(message)
super unless message.start_with?("debug")
end
end
logger = QuietLogger.new
logger.log("started")
logger.log("debug x=1")
logger.log("done")Çıktı:
LOG started
LOG doneGörev
KolaySınıfları tamamla. Person, name ve age değerlerini depolar ve to_s metodu Ada (36) döndürür. Student bir okul ekler: initialize metodu adı ve yaşı super'a aktarır ve to_s metodu super kullanılarak oluşturulan Ada (20), studies at MIT değerini döndürür. Teacher de aynı şekilde bir ders ekler ve Bo (45), teaches maths döndürür.
Sağlanan kod person Ada 36, student Ada 20 MIT veya teacher Bo 45 maths satırlarını okur ve her nesneyi yazdırır.
Kodun person.rb, student.rb ve teacher.rb dosyalarına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'person'
require_relative 'student'
require_relative 'teacher'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
input.each do |line|
kind, name, age, extra = line.split
person = case kind
when "student" then Student.new(name, age.to_i, extra)
when "teacher" then Teacher.new(name, age.to_i, extra)
else Person.new(name, age.to_i)
end
puts person
end
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