Menu
CoddyTech

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

Görev

Kolay

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