Menimpa method
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 23 dari 57.
Subclass dapat meng-override method dengan mendefinisikan method yang memiliki nama sama. Ruby mencari method di class milik object terlebih dahulu, lalu di superclass. Jadi, versi subclass yang digunakan:
class Animal
def speak
"..."
end
end
class Dog < Animal
def speak
"Woof"
end
end
class Fish < Animal
end
puts Dog.new.speak
puts Fish.new.speakOutput:
Woof
...Method superclass yang memanggil method lain menggunakan versi yang ditimpa untuk object subclass. Method bersama ditulis satu kali, dan setiap subclass hanya mengubah bagian yang berbeda:
class Animal
def initialize(name)
@name = name
end
def introduce
"#{@name} says #{speak}"
end
def speak
"..."
end
end
class Cat < Animal
def speak
"Meow"
end
end
puts Cat.new("Tom").introduce
puts Animal.new("Thing").introduceOutput:
Tom says Meow
Thing says ...Meng-override to_s di subclass mengubah cara hanya subclass tersebut mencetak. Method yang tidak di-override tetap berasal dari superclass:
class Item
def initialize(name, price)
@name = name
@price = price
end
def to_s
format("%s %.2f", @name, @price)
end
end
class SaleItem < Item
def to_s
format("%s %.2f (sale)", @name, @price * 0.8)
end
end
puts Item.new("Lamp", 20)
puts SaleItem.new("Lamp", 20)Output:
Lamp 20.00
Lamp 16.00 (sale)Urutan pencarian Ruby adalah leluhur class tersebut: class itu sendiri, lalu superclass-nya, dan seterusnya hingga Object. Class pertama dalam daftar tersebut yang mendefinisikan method akan menyediakannya:
class Animal
def speak
"..."
end
end
class Dog < Animal
def speak
"Woof"
end
end
class Puppy < Dog
end
puts Puppy.new.speak
p Puppy.ancestors.take(3)Output:
Woof
[Puppy, Dog, Animal]Tantangan
MudahLengkapi class penggajian. Employee menyimpan name dan memiliki pay(hours), yang mengembalikan hours * 20, serta payslip(hours), yang mengembalikan Ada: 800 menggunakan pay. Manager mengganti pay dengan nilai tetap 1500, berapa pun jumlah jamnya. Intern mengganti pay dengan hours * 12, tetapi maksimal 300. payslip hanya didefinisikan di Employee.
Kode yang disediakan membaca baris employee Ada 40, manager Bo 50, atau intern Cy 20, membuat object yang sesuai dan mencetak slip gajinya, lalu mencetak total gaji.
Kodemu ditulis di employee.rb, manager.rb, dan intern.rb. main.rb berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
require_relative 'employee'
require_relative 'manager'
require_relative 'intern'
# Kode input/output yang disediakan: biarkan apa adanya
input = []
while (line = gets)
input << line.chomp
end
kinds = { "employee" => Employee, "manager" => Manager, "intern" => Intern }
total = 0
input.each do |line|
kind, name, hours = line.split
worker = kinds[kind].new(name)
puts worker.payslip(hours.to_i)
total += worker.pay(hours.to_i)
end
puts "total: #{total}"
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