web-dev-qa-db-fra.com

Comment puis-je obtenir le nom de la classe du parent dans Ruby

Supposons que j'ai une classe A et BB hérite de A. Comment imprimer le nom de la classe parent dans B

class A
end

class B < A
end

Certaines choses que j'ai essayées

>> B.new.class #=> B   #which is correct
>> B.new.parent  #=> Undefined method `parent`
>> B.parent   #=> Object
>> B.parent.class #=> Class

Merci :)

74
codeit
class A
end

class B < A
end

B.superclass # => A
B.superclass.name # => "A"
118
Sergio Tulentsev

Si vous voulez la pile d'ancêtres complète, essayez:

object.class.ancestors

Par exemple:

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
56
James S.

Étant donné un objet (classe instanciée), vous pouvez dériver la classe parente

>> x = B.new
>> x.class.superclass.name
=>"A"
18
wwright

Si Google fait venir ici quelqu'un qui travaille dans Rails, vous voudrez peut-être plutôt base_class, comme superclass traversera également la structure d'héritage d'ActiveRecord.

class A < ActiveRecord::Base
end

class B < A
end

> A.superclass
=> ActiveRecord::Base
> B.superclass
=> A

> A.base_class
=> A
> B.base_class
=> A

Même plus loin...

class C < B
end

> C.base_class
=> A

En d'autres termes, base_class vous donne le haut de l'arborescence de l'héritage, mais elle est limitée au contexte de votre application. Cependant, en ce qui concerne Rails concerne "votre application" inclut toutes les gemmes que vous utilisez, donc si vous avez un modèle qui sous-classe quelque chose défini dans une gemme, base_class retournera la classe de la gemme, pas la vôtre.

12
Joel Fouse

Le terme que vous recherchez est superclass. Et en effet, vous pouvez faire B.superclass pour obtenir A. (Vous pouvez aussi faire B.ancestors pour obtenir une liste de toutes les classes et tous les modules dont il hérite - quelque chose comme [B, A, Object, Kernel, BasicObject].)

8
Chuck

L'héritage est une relation entre deux classes. L'héritage crée une relation parent-enfant entre les classes. C'est un mécanisme de réutilisation de code qui permet des extensions indépendantes du logiciel d'origine via des classes et des interfaces publiques. L'avantage de l'héritage est que les classes situées au bas de la hiérarchie obtiennent les fonctionnalités de celles plus haut, mais peuvent également ajouter des fonctionnalités spécifiques. .

En Ruby, une classe ne peut hériter que d'une seule autre classe. (c'est-à-dire qu'une classe peut hériter d'une classe qui hérite d'une autre classe qui hérite d'une autre classe, mais une seule classe ne peut pas hériter de plusieurs classes à la fois). La classe BasicObject est la classe parente de toutes les classes de Ruby. Ses méthodes sont donc disponibles pour tous les objets, à moins qu'elles ne soient explicitement remplacées.

Ruby surmonte l'héritage de classe unique à la fois en utilisant le mixin.

Je vais essayer d'expliquer avec un exemple.

module Mux
 def sam
  p "I am an module"
 end
end
class A
  include Mux
end
class B < A
end
class C < B
end
class D < A
end

Vous pouvez tracer en utilisant class_name.superclass.name et effectuer ce processus, sauf si vous avez trouvé BasicOject dans cette hiérarchie. BasicObject est une super classe pour toutes les classes. Permet de voir supposons que nous voulons voir l'arbre de hiérarchie de classe C.

 C.superclass
   => B
 B.superclass
  => A
 A.superclass
  => Object
 Object.superclass
  => BasicObject

Vous pouvez voir toute la hiérarchie de la classe C. Sur cette approche, vous remarquerez que vous ne trouverez pas de modules inclus ou ajoutés au début dans les classes parentes.

Il existe une autre approche pour trouver une hiérarchie complète comprenant des modules. Selon Ruby doc ancêtres . Renvoie une liste de modules inclus/ajoutés au préalable dans mod (y compris le mod lui-même).

C.ancestors
 => [C, B, A, Mux, Object, Kernel, BasicObject]

Ici, Mux et Kernel sont des modules.

http://rubylearning.com/satishtalim/Ruby_inheritance.htmlhttps://en.wikipedia.org/wiki/Inheritance_ (programmation orientée objet)

2