Подклассы
Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 22 из 57.
Наследование создаёт новый класс на основе существующего. class Dog < Animal делает Dog подклассом Animal, его суперкласса. У собаки есть все методы животного, включая initialize, а также методы, которые добавляет Dog:
class Animal
attr_reader :name
def initialize(name)
@name = name
end
def eat
"#{name} is eating"
end
end
class Dog < Animal
def fetch
"#{name} fetches the ball"
end
end
rex = Dog.new("Rex")
puts rex.eat
puts rex.fetchВывод:
Rex is eating
Rex fetches the ballДобавленные методы принадлежат только подклассу. У обычного Animal их нет, и соседний класс, такой как Cat, не видит методы Dog:
class Animal
def breathe
"breathing"
end
end
class Dog < Animal
def fetch
"fetching"
end
end
class Cat < Animal
end
puts Cat.new.breathe
begin
Cat.new.fetch
rescue NoMethodError => e
puts e.message
endВывод:
breathing
undefined method `fetch' for an instance of Catsuperclass обозначает родительский класс класса. У класса Ruby может быть ровно один суперкласс, а класс, объявленный без <, наследует от Object, который предоставляет каждому объекту такие методы, как to_s и inspect:
class Animal
end
class Dog < Animal
end
puts Dog.superclass
puts Animal.superclass
puts Object.superclassВывод:
Animal
Object
BasicObjectНаследование соответствует отношению is-a: собака — это животное, сберегательный счёт — это счёт. Общее поведение выносится в суперкласс один раз, а каждый подкласс добавляет то, что отличает его от других. В этом разделе каждый класс находится в отдельном файле, и файл суперкласса загружается первым:
# main.rb
require_relative 'animal' # сначала суперкласс
require_relative 'dog' # class Dog < Animal нуждается в Animal
require_relative 'cat'Задание
ЛегкоЗавершите классы. Vehicle хранит name и количество wheels, а также имеет метод describe, который возвращает Mini has 4 wheels. Car и Bike являются подклассами Vehicle, которые не определяют initialize. Car добавляет метод honk, возвращающий Mini says beep, а Bike добавляет метод ring, возвращающий BMX rings.
Предоставленный код считывает строки car Mini или bike BMX, создаёт Car с 4 колёсами или Bike с 2 колёсами и выводит describe, звук (honk или ring) и суперкласс класса объекта.
Ваш код должен находиться в vehicle.rb, car.rb и bike.rb. В main.rb находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
require_relative 'vehicle'
require_relative 'car'
require_relative 'bike'
# Предоставленный код ввода/вывода: оставьте его как есть
input = []
while (line = gets)
input << line.chomp
end
input.each do |line|
kind, name = line.split(" ", 2)
if kind == "car"
v = Car.new(name, 4)
sound = v.honk
else
v = Bike.new(name, 2)
sound = v.ring
end
puts v.describe
puts sound
puts v.class.superclass
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовПеременные экземпляраМетоды и selfto_s и inspectПовторение — читательский билет4Инкапсуляция
Приватные методыЗащищённые методыПриватные сеттерыЗащита состоянияПовторение — торговый автомат7Полиморфизм и утиная типизация
ПолиморфизмУтиная типизацияАбстрактные методыcase и классыПовторение — способы оплаты10Шаблоны проектирования, часть 2
Делегирование с помощью ForwardableШаблон декоратораШаблон строителяШаблон состояния2Аксессоры и self
Чтение и записьПользовательские сеттерыself в методахИдентичность и равенствоПовторение — список контактов5Наследование
ПодклассыПереопределение методовВызов superis_a? и предкиПовторение — расчёт зарплаты сотрудников8Специальные методы
Равенство и хешированиеМетоды операторовИндексация и добавлениеПользовательские коллекцииПовторение — дроби11Проект: Управление библиотекой
Книги и читателиВыдача книг3Методы и переменные классов
Методы классовПеременные экземпляра классаКонстантыФабричные методыПовторение — коды купонов6Модули и примеси
Модули и includeРасширение объектовМодуль ComparableМодуль EnumerableПовторение — спортивная лига9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор Ruby