Ruby/Przedefiniowywanie metod - Wikibooks, biblioteka wolnych podręczników

Ruby/Przedefiniowywanie metod

Z Wikibooks, biblioteki wolnych podręczników.
Skocz do: nawigacji, wyszukiwania

[edytuj] Przedefiniowywanie metod

W podklasie możemy zmienić zachowanie instancji poprzez przedefiniowanie metod z nadklasy.

class Czlowiek
  def przedstaw_sie
    puts "Jestem osoba."
  end
  def koszt_biletu(wiek)
    if wiek < 12
      puts "Oplata ulgowa.";
    else
      puts "Oplata normalna.";
    end
  end
end
 
Czlowiek.new.przedstaw_sie   #=> Jestem osoba.
 
class Student1 < Czlowiek
  def przedstaw_sie
    puts "Jestem studentem."
  end
end
 
Student1.new.przedstaw_sie        #=> Jestem studentem.

Przypuszczalnie moglibyśmy tylko ulepszyć metodę przedstaw_sie z nadklasy zamiast całkowicie ją podmieniać. Do tego celu możemy użyć słowa kluczowego super.

class Student2 < Czlowiek
  def przedstaw_sie
    super
    puts "Jestem rowniez studentem."
  end
end
 
Student2.new.przedstaw_sie
#=> Jestem osoba.
#   Jestem rowniez studentem.

super pozwala nam przekazywać argumenty do oryginalnej metody. Czasem mówi się, że ludzi dzielimy na dwa rodzaje...

class Nieuczciwy < Czlowiek
  def koszt_biletu(wiek)
    super(11)   # chcemy skromna oplate
  end
end
 
Nieuczciwy.new.koszt_biletu(25) #=> Oplata ulgowa.
 
class Uczciwy < Czlowiek
  def koszt_biletu(wiek)
    super(wiek) # przekazujemy argument ktory dostalismy
  end
end
 
Uczciwy.new.koszt_biletu(25)    #=> Oplata normalna.