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

问题描述 投票:0回答:6

假设我有一个类

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
ruby
6个回答
173
投票
class A
end

class B < A
end

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

78
投票

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

object.class.ancestors

例如:

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

26
投票

如果 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 的类,而不是您的类。


19
投票

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

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

8
投票

您要查找的术语是

superclass
。事实上,您可以通过
B.superclass
来获得
A
。 (您还可以执行
B.ancestors
来获取它继承自的所有类和模块的列表 - 类似于
[B, A, Object, Kernel, BasicObject]
。)


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 文档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_(面向对象编程)

© www.soinside.com 2019 - 2024. All rights reserved.