Menu
Coddy logo textTech

Sous-classes

Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 22 sur 57.

L’héritage crée une nouvelle classe à partir d’une classe existante. class Dog < Animal fait de Dog une sous-classe de Animal, sa superclasse. Un chien possède toutes les méthodes d’un animal, y compris initialize, ainsi que les méthodes ajoutées par 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

Sortie :

Rex is eating
Rex fetches the ball

Les méthodes ajoutées appartiennent uniquement à la sous-classe. Un simple Animal ne les possède pas, et une classe sœur telle que Cat ne voit pas les méthodes 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

Sortie :

breathing
undefined method `fetch' for an instance of Cat

superclass désigne la classe parente d’une classe. Une classe Ruby possède exactement une superclasse, et une classe déclarée sans < hérite de Object, ce qui fournit à chaque objet des méthodes telles que to_s et inspect :

class Animal
end

class Dog < Animal
end

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

Sortie :

Animal
Object
BasicObject

L’héritage correspond à une relation est-un : un chien est un animal, un compte d’épargne est un compte. Le comportement partagé est placé une seule fois dans la superclasse, et chaque sous-classe ajoute ce qui la rend différente. Dans cette section, chaque classe se trouve dans son propre fichier, et le fichier de la superclasse est chargé en premier :

# main.rb
require_relative 'animal'   # la superclasse d'abord
require_relative 'dog'      # class Dog < Animal a besoin de Animal
require_relative 'cat'
challenge icon

Défi

Facile

Complétez les classes. Vehicle stocke un name et un nombre de wheels, et possède describe, qui renvoie Mini has 4 wheels. Car et Bike sont des sous-classes de Vehicle qui ne définissent pas initialize. Car ajoute honk, qui renvoie Mini says beep, et Bike ajoute ring, qui renvoie BMX rings.

Le code fourni lit les lignes car Mini ou bike BMX, crée un Car avec 4 roues ou un Bike avec 2 roues, et affiche describe, le son (honk ou ring) ainsi que la superclasse de la classe de l'objet.

Votre code doit être placé dans vehicle.rb, car.rb et bike.rb. main.rb contient le code fourni d'entrée/sortie et ne peut pas être modifié.

Essayez vous-même

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

# Code d'entrée/sortie fourni : le garder tel quel
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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Ruby en ligne