Menu
Coddy logo textTech

Subclases

Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 22 de 57.

La herencia construye una clase nueva a partir de una existente. class Dog < Animal convierte a Dog en una subclase de Animal, su superclase. Un perro tiene todos los métodos de un animal, incluido initialize, además de los métodos que añade 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

Salida:

Rex is eating
Rex fetches the ball

Los métodos añadidos pertenecen únicamente a la subclase. Un Animal simple no los tiene, y una clase hermana como Cat no puede ver los 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

Salida:

breathing
undefined method `fetch' for an instance of Cat

superclass nombra la clase padre de una clase. Una clase de Ruby tiene exactamente una superclase, y una clase declarada sin < hereda de Object, lo que proporciona a cada objeto métodos como to_s y inspect:

class Animal
end

class Dog < Animal
end

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

Salida:

Animal
Object
BasicObject

La herencia representa una relación de es-un: un perro es un animal, una cuenta de ahorros es una cuenta. El comportamiento compartido se coloca una sola vez en la superclase, y cada subclase añade lo que la hace diferente. En esta sección, cada clase vive en su propio archivo, y el archivo de la superclase se carga primero:

# main.rb
require_relative 'animal'   # la superclase primero
require_relative 'dog'      # class Dog &lt; Animal necesita Animal
require_relative 'cat'
challenge icon

Desafío

Fácil

Completa las clases. Vehicle almacena un name y un número de wheels, y tiene describe, que devuelve Mini has 4 wheels. Car y Bike son subclases de Vehicle que no definen initialize. Car añade honk, que devuelve Mini says beep, y Bike añade ring, que devuelve BMX rings.

El código proporcionado lee líneas car Mini o bike BMX, crea un Car con 4 ruedas o un Bike con 2, e imprime describe, el sonido (honk o ring) y la superclase de la clase del objeto.

Tu código va en vehicle.rb, car.rb y bike.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

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

# Código de entrada/salida suministrado: déjalo 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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de Ruby online