Как получить имя родительского класса в 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 ответов:
Если вы хотите полный стек предков попробуйте:
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_ (объектно-ориентированное программирование)