2010-04-11 119 views
5

我正在創建我的第一個rails插件。我對ruby還很新,我想知道它是否有可能獲得繼承類?Ruby獲得繼承類

例如,我正在嘗試創建一個插件,以便在不使用遷移時進行單元測試和功能測試。我想要做的是初始化一個名爲controller的類變量,以初始化爲正在測試的控制器的類型。

如果我有一個基類ControllerTest:

class ControllerTest < Test::Unit::TestCase 
    attr_accessor :controller 

    def initialize 
    super 
    @controller = "call function that will find the inheriting classes name and create an instance of that controller type." 
    end 
end 

那麼我目前停留在越來越繼承類的名稱。這可能嗎?如果沒有,有沒有人知道我可以如何執行此操作的另一種方式?

在此先感謝。

回答

9

如果您希望獲得當前所在班級的名稱,則可以使用self.class.name。如果你想獲得超類,你可以使用數組self.class.ancestors,例如self.class.ancestors[1].name。直接超類也可以用self.superclass

編輯,添加例如:

class ControllerTest 
    attr_accessor :controller 
    def initialize 
    super 
    @controller = eval "#{self.class.name}Controller.new(self)" 
    end 
end 

class Foo <ControllerTest 
end 
class Bar <ControllerTest 
end 

class Controller 
    def initialize (o) 
    puts "Created #{self.class} to control #{o.class.name}" 
    end 
end 

class FooController <Controller 
end 
class BarController <Controller 
end 

foo = Foo.new 
bar = Bar.new 

此輸出

Created FooController to control Foo 
Created BarController to control Bar 
+1

爲了將來的參考,最簡單的方法就是使用「繼承」回調。 – fig 2010-04-11 16:08:26

+1

@ fig-gnuton:如果是這樣,請發佈示例以完成*相同的事情*(=根據繼承類的名稱獲取特定類型的控制器);那對於後來發現這個問題的人來說實際上是有幫助的,並且實際上意味着要問怎麼使用'inherited'回調來代替這個問題。 – Arkku 2010-04-11 16:21:08

+1

這將是很好的downvote得到解釋;誠然,在解釋這個問題上存在分歧,但是這個答案中的代碼起作用並且按照提問者的意圖回答問題。如果它不回答其他問題,那不是答案的錯。 – Arkku 2013-03-19 19:02:00

9

很簡單:使用 「繼承」 回調。

從RDoc for Class類中: inherited(子類):無論何時創建當前類的子類,都會調用回調。

例子:

class Foo 
     def self.inherited(subclass) 
     puts "New subclass: #{subclass}" 
     end 
    end 

    class Bar < Foo 
    end 

    class Baz < Bar 
    end 
produces: 

    New subclass: Bar 
    New subclass: Baz 

http://ruby-doc.org/core/classes/Class.html#M002785

+1

@ fig-gnuton:由於OP接受了我的回答,似乎你對「不回答問題」的失望可能有些不正確。 – Arkku 2010-04-11 15:35:40

+0

哈哈,你的選擇仍然較差。 OP顯然不知道如何選擇答案。 :) – fig 2010-04-11 15:40:40

+1

@ fig-gnuton:OP選擇了符合他的問題中發佈的代碼示例的唯一答案。你(和許多其他海報)在最後解釋(不可否認的)措辭的方式不會改變OP要求提出的意思。所以,儘管你的回答對你所問的問題是完全有效的,但這只是意味着這個問題可能並不是很清楚,但它給出了一個可以接受的答案。 – Arkku 2010-04-11 15:58:07

0

我相信你需要趕上班,因爲它們可以被定義...

從針對的RDoc Class類:

inherited(subclass) 
Callback invoked whenever a subclass of the current class is created. 

Example: 

    class Foo 
     def self.inherited(subclass) 
     puts "New subclass: #{subclass}" 
     end 
    end 

    class Bar < Foo 
    end 

    class Baz < Bar 
    end 
produces: 

    New subclass: Bar 
    New subclass: Baz 
+0

複製了之前發佈的相同答案。 – fig 2010-04-11 12:13:37

+0

當我開始發佈這個答案你不在那裏。對不起,如果你冒犯了,但我沒有看到你的答案,直到我發佈我的。 – 2010-04-11 12:27:28

0

這將只列出當前類中的實例方法

self.class.new.methods - self.class.ancestors [1] .new.methods

而通用的解決方案 C = some_class

c.new.methods - c.ancestors [1] .new.methods