Menu
CoddyTech

Memanggil super

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 24 dari 57.

Di dalam method yang dioverride, super memanggil versi method yang sama milik superclass. Subclass dapat mengembangkan hasilnya alih-alih mengulanginya:

class Greeter
  def greet(name)
    "Hello, #{name}"
  end
end

class LoudGreeter < Greeter
  def greet(name)
    super.upcase + "!"
  end
end

puts LoudGreeter.new.greet("Ada")

Output:

HELLO, ADA!

Penggunaan yang paling umum adalah initialize: subclass menerima nilai tambahan, meneruskan nilai-nilai yang sama ke superclass dengan super(...), lalu menyimpan nilainya sendiri:

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}"

Output:

Ada, 20, MIT

Ketiga bentuk ini berbeda dalam hal argumen yang diteruskan. super tanpa tanda kurung meneruskan argumen yang sama dengan yang diterima method saat ini; super() tidak meneruskan argumen; super(a, b) meneruskan argumen tersebut saja:

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)

Output:

Base got [1, 2] | Base got [] | Base got [2]

super dapat dijalankan di mana saja dalam method, atau hanya dalam kondisi tertentu. Saat initialize milik subclass menerima argumen yang berbeda dari milik parent-nya, super tanpa argumen akan meneruskan argumen yang salah, dan ini sering menyebabkan ArgumentError:

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")

output:

LOG started
LOG done
challenge icon

Tantangan

Mudah

Lengkapi class. Person menyimpan name dan age, dan to_s-nya mengembalikan Ada (36). Student menambahkan sekolah: initialize-nya meneruskan nama dan usia ke super, dan to_s-nya mengembalikan Ada (20), studies at MIT, yang dibuat dari super. Teacher menambahkan mata pelajaran dengan cara yang sama dan mengembalikan Bo (45), teaches maths.

Kode yang disediakan membaca baris person Ada 36, student Ada 20 MIT atau teacher Bo 45 maths, lalu mencetak setiap object.

Tuliskan kodemu di person.rb, student.rb, dan teacher.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

require_relative 'person'
require_relative 'student'
require_relative 'teacher'

# Kode input/output yang disediakan: biarkan apa adanya
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online