2013-02-08 5 views
47

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

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 

Спасибо :)

+3

когда застрял, как это всегда попробовать 'B.methods.sort' в IRB. Возможно, что-то даст вам ключ к названию метода, который вы ищете. –

+0

@IvayloStrandjev Это не поможет. Слишком много методов для просмотра. Это пустая трата времени. – sawa

+0

@sawa не соответствует действительности. Мне потребовалось 30 секунд. Достаточно для других пользователей быть быстрее меня, но довольно быстро. –

ответ

83
class A 
end 

class B < A 
end 

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

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

14

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

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

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

object.class.ancestors 

например:

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

В случае, если 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 вернет класс драгоценного камня, а не ваш.

1

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

В Ruby класс может наследовать только один класс. (то есть класс может наследовать от класса, который наследуется от другого класса, который наследуется от другого класса, но один класс не может наследовать сразу со многих классов). Класс 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 

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

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

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

Здесь Mux и Kernel являются модулями.

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

Смежные вопросы