Menu
CoddyTech

Metotları geçersiz kılma

Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 23 / 57.

Bir alt sınıf, aynı ada sahip bir yöntem tanımlayarak bir yöntemi geçersiz kılabilir. Ruby, önce nesnenin kendi sınıfındaki yöntemi, ancak ondan sonra üst sınıftaki yöntemi arar; bu nedenle alt sınıfın sürümü kullanılır:

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

Çıktı:

Woof
...

Başka bir metodu çağıran bir üst sınıf metodu, alt sınıf nesneleri için geçersiz kılınmış sürümü kullanır. Ortak metot bir kez yazılır ve her alt sınıf yalnızca farklı olan kısmı değiştirir:

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

Çıktı:

Tom says Meow
Thing says ...

Bir alt sınıfta to_s metodunu geçersiz kılmak, yalnızca o alt sınıfın nasıl yazdırılacağını değiştirir. Geçersiz kılmadığı metotlar üst sınıftan gelmeye devam eder:

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)

Çıktı:

Lamp 20.00
Lamp 16.00 (sale)

Ruby'nin arama yaptığı sıra, sınıfın ata sınıflarıdır: önce sınıfın kendisi, ardından üst sınıfı ve böylece Object sınıfına kadar devam eder. Listedeki yöntemi tanımlayan ilk sınıf, bu yöntemi sağlar:

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)

Çıktı:

Woof
[Puppy, Dog, Animal]
challenge icon

Görev

Kolay

Bordro sınıflarını tamamla. Employee, bir name saklar ve pay(hours) metoduna sahiptir; bu metot hours * 20 döndürür. Ayrıca payslip(hours) metodu pay kullanarak Ada: 800 döndürür. Manager, saat sayısı ne olursa olsun sabit 1500 döndürecek şekilde pay metodunu geçersiz kılar. Intern, pay metodunu hours * 12 döndürecek şekilde geçersiz kılar, ancak sonuç en fazla 300 olur. payslip yalnızca Employee içinde tanımlanır.

Sağlanan kod; employee Ada 40, manager Bo 50 veya intern Cy 20 satırlarını okur, eşleşen nesneyi oluşturup bordrosunu yazdırır ve ardından toplam ücreti yazdırır.

Kodunu employee.rb, manager.rb ve intern.rb dosyalarına yaz. main.rb, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

require_relative 'employee'
require_relative 'manager'
require_relative 'intern'

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 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