如何在Ruby中获取父类的类名
假设我有一个类A
和B
, B
inheritance了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"
如果谷歌带来了任何在Rails中工作的人,你可能想要的是base_class
,因为superclass
也会遍历ActiveRecordinheritance结构。
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
为您提供inheritance树的顶部,但仅限于您的应用程序的上下文。 公平的警告,就Rails而言,“你的应用程序”包含了你正在使用的任何gem,所以如果你有一个模型将子类定义在gem中, base_class
将返回gem的类,而不是你的。
你要找的是superclass
。 而且事实上,你可以做B.superclass
得到A
(你也可以做B.ancestors
来获取它所inheritance的所有类和模块的列表,比如[B, A, Object, Kernel, BasicObject]
。
inheritance是两个类之间的关系。 inheritance在类之间创build父子关系。 它是代码重用的一种机制,允许通过公共类和接口对原始软件进行独立的扩展。inheritance的好处是下层的类可以获得更高层的特性,但也可以添加自己的特定特性。
在Ruby中,一个类只能从另外一个类inheritance。 (即一个类可以从inheritance另一个类inheritance的类inheritance,但是一个类不能同时inheritance多个类)。 BasicObject类是Ruby中所有类的父类。 因此,它的方法对所有对象都是可用的,除非明确地被覆盖。
Ruby通过使用mixin立即克服了单个类的inheritance。
我会试着用一个例子来解释。
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进行跟踪,并执行此过程,除非您在此层次结构中find了BasicOject。 BasicObject是每个类的超类。 让我们看看假设我们想看到C类层次树。
C.superclass => B B.superclass => A A.superclass => Object Object.superclass => BasicObject
您可以看到类C的整个层次结构。使用这种方法需要注意的是,您将不会发现在父类中包含或预置的模块。
还有另一种方法来查找包括模块的完整层次结构。 根据Ruby doc的祖先 。 返回mod中包含/预置的模块列表(包括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);