Ruby/Przedefiniowywanie metod

Przedefiniowywanie metod

edytuj

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.