如何在Ruby中获取父级的类名

时间:2013-02-08 18:15:12

标签: ruby

假设我有一个类AB,其中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 个答案:

答案 0 :(得分:110)

class A
end

class B < A
end

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

答案 1 :(得分:53)

如果你想要完整的祖先堆栈,请尝试:

object.class.ancestors

例如:

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

答案 2 :(得分:18)

给定一个对象(实例化类),您可以派生父类

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

答案 3 :(得分:12)

如果谷歌带来了任何在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将返回宝石的类,而不是你的。

答案 4 :(得分:8)

您正在寻找的术语是superclass。事实上,你可以B.superclass获得A。 (您也可以B.ancestors获取其继承的所有类和模块的列表 - 类似于[B, A, Object, Kernel, BasicObject]。)

答案 5 :(得分:2)

  

继承是两个类之间的关系。继承创造了一个   类之间的父子关系。它是一种代码机制   重用并允许通过原始软件的独立扩展   公共类和接口。继承的好处是   较低级别的类获得更高级别的功能,   但也可以添加自己的特定功能。

在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 doc ancestors。返回包含/预先包含在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)