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, MITKetiga 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 doneTantangan
MudahLengkapi 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
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classVariabel instansmethod dan selfto_s dan inspectRingkasan: Kartu Perpustakaan4Enkapsulasi
private methodprotected methodprivate setterMelindungi StatusUlasan, Mesin Penjual Otomatis7Polimorfisme dan Duck Typing
PolimorfismeDuck TypingMethod Abstrakcase dan classRingkasan: Method Pembayaran2Accessor dan self
Pembaca dan PenulisSetter Kustomself dalam methodIdentitas dan KesetaraanRangkuman: Daftar Kontak8Special method
Kesetaraan dan hashOperator methodPengindeksan dan penambahanKoleksi kustomRingkasan: Pecahan11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam Buku3Method dan Variabel class
Method classVariabel instance classKonstantaMethod pabrikRangkuman: Kode KuponLatihan sendiri: Compiler Ruby online