Menu
Coddy logo textTech

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 done
challenge icon

Görev

Kolay

Sı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
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 Ruby derleyicisi