Ruby:没有多态的当前类的调用方法

时间:2017-08-30 12:58:15

标签: ruby oop polymorphism override

如何强制method_2调用A :: method_1?

class A
  def method_1
    puts "A"
  end

  def method_2
    method_1 #call A::method_1 only if this is instance of A
  end
end

class B < A
  def method_1
    puts "B"
  end
end

B.new.method_2

在通常的实现中,method_1被覆盖。有没有办法调用A的覆盖方法?

1 个答案:

答案 0 :(得分:1)

虽然这是一个奇怪的问题,但您仍然可以使用此代码完全按照您的要求实现:

class A
  def method_1
    puts "A"
  end

  def method_2
    A.instance_method(:method_1).bind(self).call
  end
end

class B < A
  def method_1
    puts "B"
  end
end

puts B.new.method_2
# => A

由于您有B的实例,method_1会被覆盖。但您可以通过A#method_1直接指向A.instance_method

instance_method会返回UnboundMethod,这意味着它没有self的引用。因此,您需要将其与.bind(self)绑定。

然后使用.call调用方法。