is_a? et ancêtres
Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 25 sur 57.
is_a?(Class) vérifie si un objet est une instance de cette classe ou de l’une de ses sous-classes. kind_of? est un autre nom pour la même méthode :
class Animal
end
class Dog < Animal
end
rex = Dog.new
puts rex.is_a?(Dog)
puts rex.is_a?(Animal)
puts rex.is_a?(Object)
puts rex.kind_of?(String)Résultat :
true
true
true
falseinstance_of? est plus strict : il vaut true uniquement pour la propre classe de l'objet. obj.class renvoie cette classe :
class Animal
end
class Dog < Animal
end
rex = Dog.new
puts rex.instance_of?(Dog)
puts rex.instance_of?(Animal)
puts rex.classSortie :
true
false
Dogancestors répertorie les classes que Ruby parcourt pour rechercher des méthodes, en commençant par la classe elle-même ; la liste complète contient également des modules tels que Kernel, abordé au chapitre 6, donc take(3) affiche les premières entrées. Les classes peuvent être comparées : Dog < Animal vaut true lorsque Dog hérite de Animal :
class Animal
end
class Dog < Animal
end
p Dog.ancestors.take(3)
puts Dog < Animal
puts Animal < DogRésultat :
[Dog, Animal, Object]
true
falseUtilisez is_a? lorsque le code doit traiter un groupe de classes de la même manière, par exemple pour compter tous les mammifères, quelle que soit leur sous-classe. Demander une seule classe exacte avec instance_of? cesse de fonctionner dès que quelqu’un ajoute une sous-classe :
mammals = animals.count { |a| a.is_a?(Mammal) } # chiens, chauves-souris, baleines...
exact = animals.count { |a| a.instance_of?(Mammal) } # manque toutes les sous-classesDéfi
FacileDéclare les classes d’animaux : Animal, Mammal < Animal, Bird < Animal, Dog < Mammal, Bat < Mammal et Penguin < Bird. Animal stocke un nom. Complète ensuite l’assistant describe(animal) dans functions.rb : il renvoie Rex is a dog: mammal, Pingu is a penguin: bird, avec le nom de la classe en minuscules et le groupe déterminé avec is_a?.
Le code fourni lit des lignes dog Rex, crée les objets, affiche describe pour chacun, puis mammals: 2, birds: 1.
Ton code doit se trouver dans animal.rb, mammal.rb, bird.rb, dog.rb, bat.rb, penguin.rb et functions.rb. main.rb contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
require_relative 'animal'
require_relative 'mammal'
require_relative 'bird'
require_relative 'dog'
require_relative 'bat'
require_relative 'penguin'
require_relative 'functions'
# Code d'entrée/sortie fourni : le garder tel quel
input = []
while (line = gets)
input << line.chomp
end
kinds = { "dog" => "Dog", "bat" => "Bat", "penguin" => "Penguin" }
animals = input.map do |line|
kind, name = line.split
Object.const_get(kinds[kind]).new(name)
end
animals.each { |a| puts describe(a) }
mammals = animals.count { |a| a.is_a?(Mammal) }
birds = animals.count { |a| a.is_a?(Bird) }
puts "mammals: #{mammals}, birds: #{birds}"
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