假设我有一个类
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]
如果 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 的类,而不是您的类。
给定一个对象(实例化类),您可以派生父类
>> x = B.new
>> x.class.superclass.name
=>"A"
您要查找的术语是
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 中包含/前置的模块列表(包括 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_(面向对象编程)