Подтвердить что ты не робот

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

Спасибо:)

4b9b3361

Ответ 1

class A
end

class B < A
end

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

Ответ 2

Если вы хотите, чтобы стек полного предка попытался:

object.class.ancestors

Например:

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

Ответ 3

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

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

Ответ 4

В случае, если 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 вернет класс gem, а не ваш.

Ответ 5

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

Ответ 6

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

В 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

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

Существует еще один подход для поиска полной иерархии, включая модули. Согласно документу Ruby 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)