假设我有一个类,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
谢谢 :)
8.methods.grep(/class/)
您甚至都不需要使用这种过滤进行排序:)
Answers:
如果要完整的祖先堆栈,请尝试:
object.class.ancestors
例如:
> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
Array
其后Enumerable
不是父对象,而是Array包含的模块。如果只需要类,则可以执行Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, 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的类,而不是您的类。
继承是两个类之间的关系。继承在类之间创建父子关系。它是一种代码重用机制,并允许通过公共类和接口对原始软件进行独立扩展。继承的好处是,层次结构中较低的类可以获得较高者的功能,但也可以添加自己的特定功能。
在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_(面向对象编程)
B.methods.sort
使用irb。也许有些东西会为您提供有关所寻找方法名称的线索。