2010-04-11 74 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