从孩子那里调用父母的方法

时间:2012-08-24 21:37:41

标签: ruby

一些代码

class Parent

  def print
    p "Hi I'm the parent"
  end
end

class Child < Parent

  def initialize(num)
    @num = num
  end

  def print
    child_print
  end

  def child_print
    if @num == 1 
      #call parent.print 
    else
      p "I'm the child"
    end 
  end
end

c1 = Child.new(1)
c2 = Child.new(2)
c1.print
c2.print

ChildParent的一个实例。 Print是接口中公开的方法,两个类都定义它们。 Child决定在(可能非常复杂的)方法中做其他事情,但会在某种情况下调用其父方法。

我可以写

  def print
    if @num == 1 
      super
    else
      p "I'm the child"
    end 
  end

这是有效的,但如果它不仅仅是一个简单的单线比较,而是做了很多复杂的事情,应该分成另一种方法呢?在决定调用父方法之前,可能需要进行一些计算。

也许有一种不同的,更好的方式来设计它。

1 个答案:

答案 0 :(得分:1)

Parent.instance_method(:print).bind(self).call

这已经非常易读,但这是一个解释。

  1. 获取#print
  2. Parent方法
  3. 将其绑定到您当前的对象
  4. 称之为
  5. PS:您甚至可以向#call提供参数,并将它们转发给被调用的方法。

    PPS:也就是说,这样的代码几乎总是暗示你的课堂设计存在问题。你应尽量避免使用它。