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.fetchSortie :
Rex is eating
Rex fetches the ballLes 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
endSortie :
breathing
undefined method `fetch' for an instance of Catsuperclass 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.superclassSortie :
Animal
Object
BasicObjectL’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'Défi
FacileComplé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
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
1Classes et objets
Travailler avec des fichiersDéfinir des classesVariables d’instanceMéthodes et selfto_s et inspectRécapitulatif - Carte de bibliothèque4Encapsulation
Méthodes privéesMéthodes protégéesSetters privésProtéger l’étatRécapitulatif - Distributeur automatique7Polymorphisme et typage canard
PolymorphismeTypage canardMéthodes abstraitesCas et classesRécapitulatif - méthodes de paiement10Patrons de conception – Partie 2
Délégation avec ForwardablePatron DécorateurPatron BuilderPatron État2Accesseurs et self
Lecteurs et écrivainsSetters personnalisésself dans les méthodesIdentité et égalitéRécapitulatif - Liste de contacts5Héritage
Sous-classesRedéfinition des méthodesAppeler superis_a? et ancêtresRécapitulatif - Paie du personnel8Méthodes spéciales
Égalité et hachageMéthodes d’opérateursIndexation et ajoutCollections personnaliséesRécapitulatif - Fractions11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Compilateur Ruby en ligne