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