Привет, друзья! Сегодня мы погрузимся в увлекательный мир объектно-ориентированного программирования на Ruby. Наш урок посвящен двум ключевым концепциям ООП: наследованию и полиморфизму. Эти мощные инструменты позволят вам создавать более гибкий и эффективный код. Поехали!
Предыдущий урок: Основы ООП в Ruby
Следующий урок: Модули и миксины в Ruby
Что такое наследование в Ruby?
Наследование — это механизм, который позволяет создавать новые классы на основе существующих. Класс, от которого происходит наследование, называется родительским или базовым, а новый класс — дочерним или производным.
Пример наследования:
class Animal
def speak
"Я говорю!"
end
end
class Dog < Animal
def bark
"Гав-гав!"
end
end
rex = Dog.new
puts rex.speak # Выведет: "Я говорю!"
puts rex.bark # Выведет: "Гав-гав!"
В этом примере класс Dog
наследует от класса Animal
. Это означает, что Dog
получает все методы Animal
, плюс может иметь свои собственные методы.
Переопределение методов
Одно из преимуществ наследования — возможность переопределять методы родительского класса:
class Cat < Animal
def speak
"Мяу!"
end
end
whiskers = Cat.new
puts whiskers.speak # Выведет: "Мяу!"
Здесь мы переопределили метод speak
для класса Cat
.
Использование super
Ключевое слово super
позволяет вызвать метод родительского класса из переопределенного метода:
class Bird < Animal
def speak
super + " Чирик-чирик!"
end
end
tweety = Bird.new
puts tweety.speak # Выведет: "Я говорю! Чирик-чирик!"
Что такое полиморфизм?
Полиморфизм — это способность объектов с одинаковым интерфейсом иметь различную реализацию. В Ruby это часто достигается через наследование и переопределение методов.
Пример полиморфизма:
def make_sound(animal)
puts animal.speak
end
make_sound(Animal.new) # Выведет: "Я говорю!"
make_sound(Dog.new) # Выведет: "Я говорю!"
make_sound(Cat.new) # Выведет: "Мяу!"
make_sound(Bird.new) # Выведет: "Я говорю! Чирик-чирик!"
Здесь метод make_sound
работает с любым объектом, у которого есть метод speak
, независимо от конкретного класса объекта.
Практическое задание
Давайте создадим иерархию классов для разных видов транспорта:
class Vehicle
def initialize(name)
@name = name
end
def start_engine
"Двигатель #{@name} запущен."
end
end
class Car < Vehicle
def drive
"#{@name} едет по дороге."
end
end
class Plane < Vehicle
def fly
"#{@name} летит по небу."
end
end
class Ship < Vehicle
def sail
"#{@name} плывет по воде."
end
end
# Использование классов
tesla = Car.new("Tesla")
boeing = Plane.new("Boeing 747")
titanic = Ship.new("Титаник")
puts tesla.start_engine # Выведет: "Двигатель Tesla запущен."
puts tesla.drive # Выведет: "Tesla едет по дороге."
puts boeing.start_engine # Выведет: "Двигатель Boeing 747 запущен."
puts boeing.fly # Выведет: "Boeing 747 летит по небу."
puts titanic.start_engine # Выведет: "Двигатель Титаник запущен."
puts titanic.sail # Выведет: "Титаник плывет по воде."
Заключение
Наследование и полиморфизм — мощные инструменты в арсенале Ruby-разработчика. Они позволяют создавать гибкие и расширяемые программы, уменьшая дублирование кода и повышая его читаемость.
В следующем уроке мы рассмотрим модули и миксины — еще одни важные концепции Ruby, которые дополняют и расширяют возможности наследования.
Не забудьте попрактиковаться с примерами из урока и попробуйте создать свою собственную иерархию классов. Удачи в изучении Ruby!