Menu
Coddy logo textTech

Subclasses

Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 22 de 57.

Herança cria uma nova classe com base em uma já existente. class Dog < Animal torna Dog uma subclasse de Animal, sua superclasse. Um cachorro tem todos os métodos de um animal, incluindo initialize, além dos métodos que Dog adiciona:

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

Saída:

Rex is eating
Rex fetches the ball

Os métodos adicionados pertencem apenas à subclasse. Um Animal comum não os possui, e uma classe irmã como Cat não vê os métodos de 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

Saída:

breathing
undefined method `fetch' for an instance of Cat

superclass nomeia a classe pai de uma classe. Uma classe Ruby tem exatamente uma superclasse, e uma classe declarada sem < herda de Object, que fornece a todos os objetos métodos como to_s e inspect:

class Animal
end

class Dog < Animal
end

puts Dog.superclass
puts Animal.superclass
puts Object.superclass

Saída:

Animal
Object
BasicObject

A herança se encaixa em uma relação is-a: um cachorro é um animal, uma conta poupança é uma conta. O comportamento compartilhado fica na superclasse uma única vez, e cada subclasse adiciona o que a torna diferente. Nesta seção, cada classe fica em seu próprio arquivo, e o arquivo da superclasse é carregado primeiro:

# main.rb
require_relative 'animal'   # a superclasse primeiro
require_relative 'dog'      # class Dog &lt; Animal precisa de Animal
require_relative 'cat'
challenge icon

Desafio

Fácil

Complete as classes. Vehicle armazena um name e um número de wheels e tem describe, que retorna Mini has 4 wheels. Car e Bike são subclasses de Vehicle que não definem initialize. Car adiciona honk, retornando Mini says beep, e Bike adiciona ring, retornando BMX rings.

O código fornecido lê linhas car Mini ou bike BMX, cria um Car com 4 rodas ou uma Bike com 2, e imprime describe, o som (honk ou ring) e a superclasse da classe do objeto.

Seu código deve ficar em vehicle.rb, car.rb e bike.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

require_relative 'vehicle'
require_relative 'car'
require_relative 'bike'

# Código de entrada/saída fornecido: mantenha-o como está
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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de Ruby online