Como faço para obter o nome da classe do pai em Ruby

86

Vamos supor que eu tenha classes Ae Bonde Bherde A. Como faço para imprimir o nome da classe pai emB

class A
end

class B < A
end

Algumas coisas eu tentei

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

Obrigado :)

Rahul Tapali
fonte
5
quando preso assim, sempre tente B.methods.sortno irb. Talvez algo lhe dê uma pista sobre o nome do método que você procura.
Ivaylo Strandjev
@IvayloStrandjev Isso não vai ajudar. Existem muitos métodos para examinar. É perda de tempo.
sawa
1
@sawa não é verdade. Demorou 30 segundos. O suficiente para que outros usuários sejam mais rápidos do que eu, mas bastante rápidos.
Ivaylo Strandjev
9
@checkit: muito mais simples! 8.methods.grep(/class/)Você nem precisa classificar com este tipo de filtro :)
Sergio Tulentsev
@SergioTulentsev nice one !! será muito útil :)
Rahul Tapali

Respostas:

136
class A
end

class B < A
end

B.superclass # => A
B.superclass.name # => "A"
Sergio Tulentsev
fonte
62

Se você quiser a pilha ancestral completa, tente:

object.class.ancestors

Por exemplo:

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
James S.
fonte
1
Lembre-se de que isso também inclui módulos incluídos em uma aula. Você pode ver Arrayseguido por Enumerable, que não é um pai, mas um módulo incluído no Array . Se você quiser apenas as aulas, pode fazer algo como Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject].
3limin4t0r
18

Dado um objeto (classe instanciada), você pode derivar a classe pai

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

No caso do google trazer aqui alguém que está trabalhando em Rails, o que você pode querer é base_class, pois superclassirá percorrer a estrutura de herança do ActiveRecord também.

class A < ActiveRecord::Base
end

class B < A
end

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

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

Ainda mais ...

class C < B
end

> C.base_class
=> A

Em outras palavras, base_classfornece o topo da árvore de herança, mas limitado ao contexto de seu aplicativo. Porém, um aviso justo, no que diz respeito ao Rails, "sua aplicação" inclui quaisquer gemas que você esteja usando, então se você tiver um modelo que subclasse algo definido em uma gema, base_classretornará a classe da gema, não a sua.

Joel Fouse
fonte
8

O termo que você está procurando é superclass. E de fato você pode fazer B.superclasspara conseguir A. (Você também pode fazer B.ancestorspara obter uma lista de todas as classes e módulos dos quais ele herda - algo como [B, A, Object, Kernel, BasicObject].)

Mandril
fonte
2

Herança é uma relação entre duas classes. A herança cria um relacionamento pai-filho entre as classes. É um mecanismo para reutilização de código e para permitir extensões independentes do software original por meio de classes e interfaces públicas. O benefício da herança é que as classes mais baixas na hierarquia obtêm os recursos das mais altas, mas também podem adicionar recursos específicos próprios .

Em Ruby, uma classe só pode herdar de uma única outra classe. (ou seja, uma classe pode herdar de uma classe que herda de outra classe que herda de outra classe, mas uma única classe não pode herdar de muitas classes de uma vez). A classe BasicObject é a classe pai de todas as classes em Ruby. Seus métodos estão, portanto, disponíveis para todos os objetos, a menos que sejam explicitamente substituídos.

Ruby supera a herança de classe única de uma vez usando o mixin.

Vou tentar explicar com um exemplo.

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

Você pode rastrear usando class_name.superclass.name e fazer este processo, a menos que tenha encontrado BasicOject nesta hierarquia. BasicObject é superclasse para todas as classes. vamos supor que queremos ver a árvore hierárquica da classe C.

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

Você pode ver toda a hierarquia da classe C. É importante observar que, ao usar essa abordagem, você não encontrará módulos incluídos ou anexados nas classes pai.

Existe outra abordagem para encontrar a hierarquia completa, incluindo módulos. De acordo com ancestrais Ruby doc . Retorna uma lista de módulos incluídos / prefixados no mod (incluindo o próprio mod).

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

Aqui, Mux e Kernel são Módulos.

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

Mukesh Kumar Gupta
fonte