Menu
Coddy logo textTech

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ında, ancak bundan sonra üst sınıfta bir yöntem arar; bu nedenle alt sınıfın sürümü kazanı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 ü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 yazdırılma biçimini değiştirir. Geçersiz kılmadığı metotlar hâlâ üst sınıftan gelir:

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 sırası sınıfın atasallarıdır: sınıfın kendisi, ardından üst sınıfı ve bu şekilde Object sınıfına kadar devam eder. Bu listedeki yöntemi tanımlayan ilk sınıf, 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

Maaş bordrosu sınıflarını tamamla. Employee bir name saklar ve hours * 20 döndüren pay(hours) ile pay kullanarak Ada: 800 döndüren payslip(hours) yöntemlerine sahiptir. Manager, saat sayısı ne olursa olsun sabit 1500 değeri döndürecek şekilde pay yöntemini geçersiz kılar. Intern, pay yöntemini hours * 12 döndürecek, ancak en fazla 300 olacak şekilde geçersiz kılar. payslip yalnızca Employee içinde tanımlıdır.

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

Kodun employee.rb, manager.rb ve intern.rb dosyalarına yazılmalıdır. 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