A subclass can replace a parent method with behavior that fits the more specific class.

method override When a subclass defines a method with the same name, Ruby uses the subclass version.

Method Override

speed
method_override.rb
Replay: real traced execution (multi-file project)
class Vehicle
  def move(speed)
    "moving at #{speed}"
  end
end

class Bicycle < Vehicle
  def move(speed)
    "pedaling at #{speed}"
  end
end

speed = 4
vehicle = Vehicle.new
bicycle = Bicycle.new

puts vehicle.move(speed)
puts bicycle.move(speed)
class Vehicle
  def move(speed)
    "moving at #{speed}"
  end
end

class Bicycle < Vehicle
  def move(speed)
    "pedaling at #{speed}"
  end
end

speed = 1
vehicle = Vehicle.new
bicycle = Bicycle.new

puts vehicle.move(speed)
puts bicycle.move(speed)
class Vehicle
  def move(speed)
    "moving at #{speed}"
  end
end

class Bicycle < Vehicle
  def move(speed)
    "pedaling at #{speed}"
  end
end

speed = 8
vehicle = Vehicle.new
bicycle = Bicycle.new

puts vehicle.move(speed)
puts bicycle.move(speed)
  1. speed ← 4, vehicle ← ⟨Vehicle A⟩, bicycle ← ⟨Bicycle B⟩

    13speed→ 4 = 4  #@speed=1, 814vehicle→ ⟨Vehicle A⟩ = Vehicle.new15bicycle→ ⟨Bicycle B⟩ = Bicycle.new1617puts vehicle.move(speed)moving at 418puts bicycle.move(speed)
  2. def move(speed)

    1class Vehicle2  def move(speed4)3    "moving at #{speed4}"4  end
  3. puts vehicle.move(speed)

    17puts vehicle.move(speed)moving at 418puts bicycle.move(speed)pedaling at 4
    outputmoving at 4
  4. def move(speed)

    7class Bicycle < Vehicle8  def move(speed4)9    "pedaling at #{speed4}"10  end
  5. puts bicycle.move(speed)

    17puts vehicle.move(speed)18puts bicycle.move(speed)pedaling at 4
    outputpedaling at 4
  1. speed ← 1, vehicle ← ⟨Vehicle A⟩, bicycle ← ⟨Bicycle B⟩

    13speed→ 1 = 114vehicle→ ⟨Vehicle A⟩ = Vehicle.new15bicycle→ ⟨Bicycle B⟩ = Bicycle.new1617puts vehicle.move(speed)moving at 118puts bicycle.move(speed)
  2. def move(speed)

    1class Vehicle2  def move(speed1)3    "moving at #{speed1}"4  end
  3. puts vehicle.move(speed)

    17puts vehicle.move(speed)moving at 118puts bicycle.move(speed)pedaling at 1
    outputmoving at 1
  4. def move(speed)

    7class Bicycle < Vehicle8  def move(speed1)9    "pedaling at #{speed1}"10  end
  5. puts bicycle.move(speed)

    17puts vehicle.move(speed)18puts bicycle.move(speed)pedaling at 1
    outputpedaling at 1
  1. speed ← 8, vehicle ← ⟨Vehicle A⟩, bicycle ← ⟨Bicycle B⟩

    13speed→ 8 = 814vehicle→ ⟨Vehicle A⟩ = Vehicle.new15bicycle→ ⟨Bicycle B⟩ = Bicycle.new1617puts vehicle.move(speed)moving at 818puts bicycle.move(speed)
  2. def move(speed)

    1class Vehicle2  def move(speed8)3    "moving at #{speed8}"4  end
  3. puts vehicle.move(speed)

    17puts vehicle.move(speed)moving at 818puts bicycle.move(speed)pedaling at 8
    outputmoving at 8
  4. def move(speed)

    7class Bicycle < Vehicle8  def move(speed8)9    "pedaling at #{speed8}"10  end
  5. puts bicycle.move(speed)

    17puts vehicle.move(speed)18puts bicycle.move(speed)pedaling at 8
    outputpedaling at 8