Menu
Coddy logo textTech

Подклассы

Часть раздела Объектно-ориентированное программирование путешествия по 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 Cat

superclass обозначает родительский класс класса. У класса 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 &lt; Animal нуждается в Animal
require_relative 'cat'
challenge icon

Задание

Легко

Завершите классы. 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Ruby