Ruby获取继承类

时间:2010-04-11 00:54:49

标签: ruby inheritance

我正在创建我的第一个rails插件。我仍然对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

所以我目前所坚持的是获取继承类的名称。这可能吗?如果没有,有没有人知道如何实现这个目标?

提前致谢。

4 个答案:

答案 0 :(得分: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 :(得分:9)

非常简单:使用“继承的”回调。

从Class类的RDoc: inherited(subclass):只要创建当前类的子类,就会调用Callback。

示例:

   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

答案 2 :(得分:0)

我相信你需要在课程定义时抓住课程......

来自Class类的RDoc:

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

答案 3 :(得分:0)

这将仅列出当前类

中的实例方法
  

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

通用解决方案 c = some_class

  

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