0

いくつかのコード

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

ChildのインスタンスですParentPrintインターフェイスで公開されるメソッドであり、両方のクラスがそれらを定義します。Child(おそらく非常に複雑な) メソッドで他のことを行うことを決定しますが、何らかの条件下でその親のメソッドを呼び出します。

私はちょうど書くことができました

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

これは機能しますが、単純な 1 行での比較ではなく、別の方法に分割する必要がある多くの複雑なことを行っている場合はどうなるでしょうか? 親のメソッドを呼び出す必要があると判断する前に、いくつかの計算を行う必要がある場合があります。

あるいは、それを設計する別のより良い方法があるかもしれません。

4

1 に答える 1

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

これはすでにかなり読みやすいですが、ここに説明があります。

  1. クラスの#printメソッドを取得するParent
  2. 現在のオブジェクトにバインドします
  3. あれを呼べ

PS: に引数を与えることもでき#call、それらは呼び出されたメソッドに中継されます。

PPS: そうは言っても、そのようなコードはほとんどの場合、クラス設計の問題を示唆しています。可能な限り避けるようにしてください。

于 2012-08-24T22:23:56.230 に答える