2013-02-08 40 views
47

假設我有一個類AB,其中B繼承A。我如何在B我如何在Ruby中獲取父級的名稱

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 

謝謝:)

+3

堅持這樣的時候總是試圖'B.methods.sort'在IRB。也許有些東西會給你一個關於你所尋找的方法名稱的線索。 – 2013-02-08 18:17:52

+0

@IvayloStrandjev這沒有幫助。有太多的方法要查看。這是浪費時間。 – sawa 2013-02-08 18:20:37

+0

@sawa不正確。花了我30秒。足以讓其他用戶比我快,但速度很快。 – 2013-02-08 20:44:21

回答

83
class A 
end 

class B < A 
end 

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

你要找的期限爲superclass。確實你可以做B.superclass得到A。 (你也可以做B.ancestors讓所有的類和模塊從繼承名單 - 像[B, A, Object, Kernel, BasicObject]

14

給定一個對象(實例化的類),你可以得出父類

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

如果需要完整的祖先堆棧嘗試:

object.class.ancestors 

例如:

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

如果谷歌帶來任何在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將返回寶石的類,而不是你的。

1

繼承是兩個類之間的關係。繼承在類之間創建父親子關係 。它是代碼 重用的機制,並允許通過公共類和接口獨立擴展原始軟件。繼承的好處是 降低層級的類可以獲得更高級的功能,但也可以添加特定的自己的功能。

在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] 

這裏,複用器和內核是模塊。

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)