¿Cómo obtengo el nombre de la clase de los padres en Ruby?

Supongamos que tengo clases A y B donde B hereda A ¿Cómo imprimo el nombre de la clase padre en B

 class A end class B < A end 

Algunas cosas que he probado

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

Gracias 🙂

 class A end class B < A end B.superclass # => A B.superclass.name # => "A" 

Si quieres la stack de ancestros completa prueba:

 object.class.ancestors 

Por ejemplo:

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

Dado un objeto (clase instanciada) puede derivar la clase padre

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

En caso de que Google traiga a alguien aquí que esté trabajando en Rails, lo que quizás desee es base_class , ya que superclass atravesará también la estructura de herencia de 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 

Aún más…

 class C < B end > C.base_class => A 

En otras palabras, base_class le da la parte superior del árbol de herencia, pero limitado al contexto de su aplicación. Sin embargo, en lo que respecta a Rails, “su aplicación” incluye cualquier gem que esté usando, por lo que si tiene un modelo que subclasifica algo definido en una gem, base_class devolverá la clase de la gem, no la suya.

El término que estás buscando es superclass . Y de hecho puedes hacer B.superclass para obtener A (También puede hacer B.ancestors para obtener una lista de todas las clases y módulos de los que hereda, algo como [B, A, Object, Kernel, BasicObject] ).

La herencia es una relación entre dos clases. La herencia crea una relación padre-hijo entre clases. Es un mecanismo para la reutilización del código y para permitir extensiones independientes del software original a través de clases e interfaces públicas. La ventaja de la herencia es que las clases más bajas de la jerarquía obtienen las características de los que están más arriba, pero también pueden agregar características específicas propias. .

En Ruby, una clase solo puede heredar de una otra clase. (Es decir, una clase puede heredar de una clase que hereda de otra clase que hereda de otra clase, pero una clase única no puede heredar de muchas clases a la vez). La clase BasicObject es la clase principal de todas las clases en Ruby. Por lo tanto, sus métodos están disponibles para todos los objetos a menos que se invaliden explícitamente.

Ruby supera la herencia de una sola clase a la vez usando el mixin.

Trataré de explicar con un ejemplo.

 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 

Puede rastrear usando class_name.superclass.name y hacer este proceso a menos que haya encontrado BasicOject en esta jerarquía. BasicObject es súper clase o todas las clases. veamos supongamos que queremos ver árbol de jerarquía de clase C.

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

Puede ver toda la jerarquía de la clase C. Apunte a la nota usando este enfoque, no encontrará módulos que estén incluidos o incluidos en las clases principales.

Hay otro enfoque para encontrar una jerarquía completa que incluya módulos. Según los antepasados doc Ruby. Devuelve una lista de los módulos incluidos / incluidos en mod (incluido el propio mod).

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

Aquí, Mux y Kernel son módulos.

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)