Ответ 1
class A
end
class B < A
end
B.superclass # => A
B.superclass.name # => "A"
Предположим, что у меня есть классы 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
Спасибо:)
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
вернет класс gem, а не ваш.
Термин, который вы ищете, это superclass
. И действительно, вы можете сделать B.superclass
, чтобы получить A
. (Вы также можете сделать B.ancestors
, чтобы получить список всех классов и модулей, на которые он наследует - что-то вроде [B, A, Object, Kernel, BasicObject]
.)
Наследование - это отношение между двумя классами. Наследование создает родительские отношения между классами. Это механизм для кода повторно использовать и разрешать независимые расширения исходного программного обеспечения через публичные классы и интерфейсы. Преимуществом наследования является то, что классы ниже иерархии получают функции тех, кто выше, но также могут добавлять свои собственные особенности.
В 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)