继承改变了方法的类

时间:2014-05-07 21:02:22

标签: ruby inheritance

以下打印Bar两次:

class Foo
  def foo
    p self.class # => prints Bar
  end
end

class Bar < Foo
  def foo
    p self.class # => prints Bar
    super
  end
end

b = Bar.new
b.foo

如何打印

Bar
Foo

?即我想知道每种方法的定义是什么类。

3 个答案:

答案 0 :(得分:3)

要捕获最初定义方法的上下文,可以使用define_method而不是def来获取适当的闭包。一个简单的例子:

class Foo

  klass = self
  define_method(:foo){p klass}

end

class Bar < Foo

  def foo
    p self.class
    super
  end

end

b = Bar.new

b.foo

答案 1 :(得分:0)

您可以像这样更改Foo#foo(假设只有一个子类级别):

class Foo
  def foo
    if self.class == Foo
      p self.class
    else
      p self.class.superclass
    end  
  end
end

class Bar < Foo
  def foo
    p self.class
    super
  end
end

Foo.new.foo
Foo
Bar.new.foo
Bar
Foo

答案 2 :(得分:-1)

您可以使用

 b.class.superclass   <= "Foo"

你遇到的问题是,自我就是Bar的实例,b。

 b.class   <= always going to be Bar
 self.class   <= always going to be Bar if you are invoking Bar. 

您说您在运行时定义了一个方法,并且您不知道类名。我真的不知道你的意思......我处理这个的方式就像

class Bar
  def initialize  
   puts 'In BAR class'  
  end  

  def foo
    p self.class.name # => prints Bar
  end
end

然后

Bar.class_eval do
   def brand_new_method
      # do something new
      p "Still in Bar, but this is dynamically added"
   end
end

也许你正在谈论动态地将方法添加到继承链中更高的类...在你的例子中为“Foo”...基于“Bar”实例中的某些条件发生。如果是这种情况,那么为什么不使用单个模块来定义继承的方法:

module Foo
    def foo 
        p self.class
    end
end

然后以与class_eval相同的方式使用module_eval?