105

假设我有一个类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

谢谢 :)

4

6 回答 6

155
class A
end

class B < A
end

B.superclass # => A
B.superclass.name # => "A"
于 2013-02-08T18:16:37.677 回答
69

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

object.class.ancestors

例如:

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
于 2014-09-05T05:26:08.447 回答
22

如果 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 而言,“您的应用程序”包括您正在使用的任何 gem,因此如果您有一个模型子类化了 gem 中定义的某些东西,base_class则将返回 gem 的类,而不是您的类。

于 2015-11-12T19:41:07.530 回答
19

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

>> x = B.new
>> x.class.superclass.name
=>"A"
于 2014-07-11T20:37:44.797 回答
8

您要查找的术语是superclass. 事实上,你可以B.superclass做得到A。(您也可以B.ancestors获取它继承自的所有类和模块的列表——例如[B, A, Object, Kernel, BasicObject].)

于 2013-02-08T18:16:47.337 回答
3

继承是两个类之间的关系。继承创建类之间的父子关系。它是一种代码重用机制,允许通过公共类和接口对原始软件进行独立扩展。继承的好处是层次结构较低的类可以获得较高层次的特性,但也可以添加它们自己的特定特性.

在 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 文档的祖先。返回 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)

于 2017-06-06T12:19:13.857 回答