super çağrısı
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 24 / 57.
Ez geçersiz kılınan bir metodun içinde super, üst sınıfın aynı metodunun 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 metodudur: alt sınıf ek bir değer alır, ortak olanları super(...) ile üst sınıfa iletir 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, ne aktardıklarına göre farklılık gösterir. Yalın super, geçerli metodun aldığı argümanların aynısını aktarır; super() hiçbir argüman aktarmaz; super(a, b) tam olarak bu argümanları 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, metodun herhangi bir yerinde veya yalnızca bir koşul altında çalışabilir. Alt sınıfın initialize metodu, üst sınıfınkinden farklı bağımsız değişkenler aldığında yalın super yanlış olanları aktarır; bu da yaygın bir ArgumentError nedenidir:
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 saklar ve to_s, Ada (36) döndürür. Student bir okul ekler: initialize, ad ve yaşı super'a aktarır ve to_s, 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.
Kodunu person.rb, student.rb ve teacher.rb dosyalarına yaz. 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 giriş/çıkış 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