Menu
CoddyTech

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.speak

Output:

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

Output:

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

Tantangan

Mudah

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