假设我有一个类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
谢谢 :)
假设我有一个类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 文档的祖先。返回 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)