假设我有一个类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
谢谢:)
答案 0 :(得分:110)
class A
end
class B < A
end
B.superclass # => A
B.superclass.name # => "A"
答案 1 :(得分:53)
如果你想要完整的祖先堆栈,请尝试:
object.class.ancestors
例如:
> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]
答案 2 :(得分:18)
给定一个对象(实例化类),您可以派生父类
>> x = B.new
>> x.class.superclass.name
=>"A"
答案 3 :(得分:12)
如果谷歌带来了任何在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而言,“你的应用程序”包含你正在使用的任何宝石,所以如果你有一个继承宝石中定义的东西的模型,base_class
将返回宝石的类,而不是你的。
答案 4 :(得分:8)
您正在寻找的术语是superclass
。事实上,你可以B.superclass
获得A
。 (您也可以B.ancestors
获取其继承的所有类和模块的列表 - 类似于[B, A, Object, Kernel, BasicObject]
。)
答案 5 :(得分:2)
继承是两个类之间的关系。继承创造了一个 类之间的父子关系。它是一种代码机制 重用并允许通过原始软件的独立扩展 公共类和接口。继承的好处是 较低级别的类获得更高级别的功能, 但也可以添加自己的特定功能。
在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 doc 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_(object-oriented_programming)