Переопределение метода (method overriding) — это механизм объектно-ориентированного программирования, при котором дочерний класс предоставляет свою собственную реализацию метода, уже существующего в родительском классе. Это позволяет изменять или расширять поведение унаследованных методов без модификации исходного класса.
class Animal
def speak
"Издает звук"
end
end
class Dog < Animal
def speak
"Гав-гав!"
end
end
animal = Animal.new
dog = Dog.new
animal.speak # => "Издает звук"
dog.speak # => "Гав-гав!" (метод переопределен)
super
Ключевое слово super
позволяет вызывать оригинальную версию метода из родительского класса:
class Cat < Animal
def speak
super + " Мяу-мяу!"
end
end
Cat.new.speak # => "Издает звук Мяу-мяу!"
super
— без аргументов, передает текущие аргументы методаsuper()
— явный вызов без аргументовsuper(a, b)
— передача конкретных аргументовRuby позволяет переопределять даже методы базовых классов:
class String
def length
original_length = super
"Длина строки: #{original_length}"
end
end
"hello".length # => "Длина строки: 5"
При включении модулей также работает переопределение:
module Greetable
def greet
"Привет"
end
end
class Person
include Greetable
def greet
"#{super}, друг!"
end
end
Person.new.greet # => "Привет, друг!"
Дочерний класс может переопределять private-методы родителя, но это считается антипаттерном.
Классовые методы также могут быть переопределены:
class Parent
def self.inheritance_info
"Родительский класс"
end
end
class Child < Parent
def self.inheritance_info
"Дочерний класс"
end
end
Child.inheritance_info # => "Дочерний класс"
Конструктор — это обычный метод и его можно переопределять:
class Vehicle
def initialize(speed)
@speed = speed
end
end
class Car < Vehicle
def initialize(speed, model)
super(speed)
@model = model
end
end
Переопределение метода to_s
для удобного вывода объекта:
class Product
attr_reader :name, :price
def initialize(name, price)
@name = name
@price = price
end
def to_s
"#{name} - #{price} руб."
end
end
product = Product.new("Книга", 500)
puts product # => "Книга - 500 руб."
Резюмируем: переопределение методов — это мощный механизм Ruby, позволяющий подклассам предоставлять специфическую реализацию методов, унаследованных от родительских классов. При правильном использовании (особенно в сочетании с super) оно способствует созданию гибких и расширяемых иерархий классов, но требует осознанного подхода чтобы избежать типичных ошибок проектирования.