Ruby-在超类中调用另一个Class方法

|
class A
  def self.a
    puts \"self: #{self}; superclass: #{superclass}\"
  end
end

class B < A
  class << self; undef_method(:a); end  # I\'m not allowed to use B.a
  def self.b
    # here I want to call A.a with B as self.
  end
end  

A.a  #=> self: A; superclass: Object
B.b  #=> self: B; superclass: A (expected)
我不想要
alias_method
解决方案。我正在寻找这样的东西。 更新 该解决方案无需与上面的链接相似;这只是一个建议。例如,我尝试做:
class B < A
  def self.b
    instance_eval(&A.method(:a).to_proc)
  end
end
但是这样我在Ruby 1.8.7上得到了一个奇怪的
ArgumentError
。     
已邀请:
我认为使用您链接的SuperProxy方法是不可能的。 在这种情况下,
A.method(:a)
是单例方法。单例方法只能绑定到使用其创建的对象。特别是不能反弹至
B
。 这是我尝试的第一种无效方法:
class B < A
  def self.b
    A.method(:a).unbind.bind(self).call
  end
end
第二种无效方法:
class B < A
  class << self
    define_method :b, A.method(:a)
  end
end
两者都生成一个\“ TypeError:绑定到另一个对象的单例方法\”异常。     
在派生类B中调用方法时,相对于派生类的实例,A实例对象和B实例对象之间绝对没有区别。它们是完全相同的对象。 因此,在考虑实例方法时,只有一个对象。正如您指出的那样,从概念上讲,如果在调用父类中定义的方法时有点棘手,则当然可以将派生类作为自身实例。无法区分\“ A \”对象和\“ B \”对象,只有一个实例,它们对于A和B是\“ Same \”。但是对于类方法,并行您引用的反弹实例方法根本不存在。 现在,您正在谈论类方法。如您所知,对于类方法,self是类。实例是没有意义的。如果没有类A或其元类为self,则无法调用类方法A。 换句话说,您引用的技巧起作用的原因是因为只有一个对象,并且对于派生实例,它是从派生类中命名的。如果不创建被派生的父类的第二个实例,则无法做相反的事情。但是现在我们将类方法称为..好..类方法,因此不再希望引用派生类。究竟如何定义您想要的东西?     
这里唯一的解决方法是使用
B.a
class B < A
  def self.b
    a #=> self: B; superclass: A
  end
end  
    

要回复问题请先登录注册