Как получить имя родительского класса в Ruby


предположим, что у меня есть классы A и B здесь B наследует A. Как напечатать имя родительского класса в B

class A
end

class B < A
end

некоторые вещи я пробовал

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

спасибо :)

6 60

6 ответов:

class A
end

class B < A
end

B.superclass # => A
B.superclass.name # => "A"

Если вы хотите полный стек предков попробуйте:

object.class.ancestors

например:

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

данный объект (экземпляр класса) вы можете получить родительский класс

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

в случае, если google приводит сюда кого-то, кто работает в Rails, то вместо этого вы можете захотеть base_class, а superclass также будет проходить структура наследования 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

еще дальше...

class C < B
end

> C.base_class
=> A

другими словами, base_class дает вам верхнюю часть дерева наследования, но ограничивается контекстом вашего приложения. Справедливое предупреждение, однако, что касается Rails, "ваше приложение" включает в себя любые драгоценные камни, которые вы используете, поэтому, если у вас есть модель, которая подклассы что-то определенное в драгоценном камне, base_class вернет класс драгоценного камня, а не ваш.

термин, который вы ищете является superclass. И действительно, Вы можете сделать B.superclass и A. (Вы также можете сделать B.ancestors чтобы получить список всех классов и модулей, которые он наследует от - что-то вроде [B, A, Object, Kernel, BasicObject].)

наследование-это отношение между двумя классами. Наследование создать родительские дочерние отношения между классами. Это механизм, для кода повторное использование и разрешить независимые расширения исходного программного обеспечения через открытые классы и интерфейсы.Преимущество наследования заключается в том, что классы ниже по иерархии получают функции тех, кто выше, но также можно добавить свои собственные особенности.

в Ruby класс может наследовать только от a один другой класс. (т. е. класс может наследовать от класса, который наследует от другого класса, который наследует от другого класса, но один класс не может наследовать от многих классов сразу). Класс BasicObject является родительским классом всех классов в Ruby. Поэтому его методы доступны для всех объектов, если явно не переопределено.

Ruby преодолеть наследование одного класса сразу с помощью mixin.

Я постараюсь объяснить образец.

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

вы можете отслеживать с помощью class_name.superclass.name и выполните этот процесс, если вы не нашли BasicOject в этой иерархии. BasicObject супер класса о любых классов. предположим, мы хотим увидеть дерево иерархии класса C.

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

вы можете увидеть всю иерархию класса C. обратите внимание, что при использовании этого подхода вы не найдете модулей, которые включены или добавлены в родительские классы.

есть еще один подход, чтобы найти полная иерархия, включая модули. Согласно Ruby doc предков. Возвращает список модулей, включенных / добавленных в мод (включая сам мод).

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

здесь Mux и ядро являются модулями.

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_ (объектно-ориентированное программирование)