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.fetchSaída:
Rex is eating
Rex fetches the ballOs 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
endSaída:
breathing
undefined method `fetch' for an instance of Catsuperclass 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.superclassSaída:
Animal
Object
BasicObjectA 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 < Animal precisa de Animal
require_relative 'cat'Desafio
FácilComplete 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
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
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online