Наследование в Ruby - это механизм, позволяющий классу (потомку) перенимать методы и атрибуты другого класса (родителя). Ruby поддерживает одиночное наследование (класс может наследовать только от одного родителя), но компенсирует это мощной системой модулей (mixins).
class Animal
def breathe
"Вдыхает и выдыхает"
end
end
class Dog < Animal # Наследование с помощью <
def bark
"Гав-гав!"
end
end
dog = Dog.new
dog.breathe # => "Вдыхает и выдыхает" (унаследованный метод)
dog.bark # => "Гав-гав!" (собственный метод)
Когда вызывается метод, Ruby ищет его в следующем порядке:
prepend
include
Object
(и его модуль Kernel
)BasicObject
Можно посмотреть цепочку наследования:
Dog.ancestors # => [Dog, Animal, Object, Kernel, BasicObject]
Дочерний класс может переопределять методы родителя:
class Cat < Animal
def breathe
super + " тихо" # super вызывает метод родителя
end
end
Cat.new.breathe # => "Вдыхает и выдыхает тихо"
Классовые методы также наследуются:
class Animal
def self.life_span
"Неизвестно"
end
end
class Dog < Animal; end
Dog.life_span # => "Неизвестно"
Пример:
class Animal
def self.inherited(subclass)
puts "Создан новый подкласс: #{subclass}"
end
end
class Dog < Animal; end
# => "Создан новый подкласс: Dog"
Ruby использует модули для решения проблемы множественного наследования:
module Swimmable
def swim
"Плывет"
end
end
class Dog < Animal
include Swimmable
end
Dog.new.swim # => "Плывет"
class Employee
def initialize(name)
@name = name
end
def salary
0
end
end
class Developer < Employee
def salary
100_000
end
end
class Manager < Employee
def salary
150_000 + bonus
end
private
def bonus
30_000
end
end
class Array
def sum
inject(:+)
end
end
[1, 2, 3].sum # => 6
Резюмируем: наследование в Ruby - это мощный механизм для создания иерархий классов, позволяющий эффективно повторно использовать код. Хотя Ruby поддерживает только одиночное наследование классов, гибкая система модулей (mixins) компенсирует это ограничение. Понимание цепочки поиска методов и правильное использование super важно для эффективной работы с наследованием.