Rubyとオブジェクト指向についてアウトプットしてみる【委譲】

9.委譲

require 'forwardable'

class Kuririn
  def kienzan
    print "気円斬!"
  end
  def mekuramashi
    print "目くらまし!"
  end
end

class Gohan
  extend Forwardable

  def initialize
    @q = Kuririn.new
  end

  #気円斬を Kuririnに委譲(任せる)
  def_delegator :@q, :kienzan
end

gohan1 = Gohan.new
gohan1.kienzan   #=>気円斬

悟飯(Gohan)は、クリリンではないので、気円斬を使えない。
しかし、悟飯(Gohan)に気円斬を使う依頼が来た!
悟飯は気円斬を使え!と言われたが、クリリンに任せた。
これが委譲。



詳しく説明すると・・・

オブジェクトの機能を再利用する手法の一つとして、Ruby では言語仕様としてクラスの継承とモジュールの Mix-in を提供しています。これらは、元になるクラスやモジュールの実装までもをそのまま取り込んでしまいますが、他の手段で機能の再利用を実現する手法として、委譲があります。

委譲では、再利用したい機能を自分に取り込むのではなく、その機能を持つオブジェクトに処理を依頼します。

Ruby では特に言語仕様として委譲がサポートされているわけではありませんが、委譲を実現するためのライブラリとして forwardable と delegate が用意されています。具体的には、これらのライブラリを使用することによって、あるメソッド呼び出しを他のオブジェクトのメソッドに「たらい回す」ということを簡単に記述することができます。


参考


Rubyオブジェクト指向についてアウトプットしてみる○

1.メッセージ 〜オブジェクトは「問いかけたらきちんと返事をしてくれる」〜

2.継承とは

3.メソッドの実行

4.特異メソッド

5.特異クラス

6.オーバーライド

7.Mixin(include)

8.Mixin(extend)

9.委譲