Supposons que j'ai une classe A
et B
où B
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 :)
class A
end
class B < A
end
B.superclass # => A
B.superclass.name # => "A"
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]
Étant donné un objet (classe instanciée), vous pouvez dériver la classe parente
>> x = B.new
>> x.class.superclass.name
=>"A"
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.
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]
.)
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)