delegate.rb

目的・概要

メソッドの委譲(delegation)を行う。

Delegatorクラスは指定したオブジェクトにメソッドの実行を委譲する。 Delegatorクラスを利用する場合はこれを継承して__getobj__メソッドを 再定義して委譲先のオブジェクトを指定する。

SimpleDelegatorはDelegatorの利用例の一つであり、コンストラクタに 渡されたオブジェクトにメソッドの実行を委譲する。

関数DelegateClass(supperclass)はsuperclassクラスの オブジェクトをひとつとり、そのオブジェクトにインスタンスメソッドを委譲す るクラスを定義して返す。

クラス

サンプルコード

require 'delegate'
foo = Object::new
def foo.test
  p 25
end
foo2 = SimpleDelegator::new(foo)
foo2.test # => 25

class ExtArray<DelegateClass(Array)
  def initialize()
    super([])
  end
end
a = ExtArray::new
p a.type  # => ExtArray
a.push 25
p a       # => [25]

Delegator

与えられたオブジェクトの持つメソッドに関して委譲用のメソッド定義を 提供するクラス。

コンストラクタで指定されたオブジェクトのもつインスタンスメソッドのうち、 自分の持たないメソッドについて、 __getobj__が返すオブジェクトに実行を委譲するようメソッドを定義する。

インスタンスメソッド

Delegator#initialize(obj)

objのもつインスタンスメソッドのうち、 自分の持たないメソッドについて、 __getobj__が返すオブジェクトに実行を委譲する ようインスタンスメソッドを定義する。

Delegator#__getobj__

委譲先のオブジェクトを返す。 デフォルトではNotImplementErrorを発生するので、サブクラスで 再定義する必要がある。

SimpleDelegator

Delegatorクラスをそのまま利用した、 指定したオブジェクトにメソッドを委譲するクラス。

上位クラス

Delegator

クラスメソッド

SimpleDelegator.new(obj)

objがもつメソッドについて、実行をobjに委譲する オブジェクトを生成する。

インスタンスメソッド

SimpleDelegator#__getobj__

委譲先のオブジェクトを返す。

SimpleDelegator#__setobj__(obj)

委譲先のオブジェクトをobjに変更する。

委譲するメソッドの定義は生成時にのみ行われるため、 以前の委譲先オブジェクトとobjの間でインスタンスメソッドに 違いがあっても、 委譲するインスタンスメソッドの再設定は行われないことに注意。

関数

DelegateClass(superclass)

クラスsuperclassのインスタンスへメソッドを委譲するクラスを 定義し、そのクラスを返す。

SEE ALSO

Object#method_missing(method_symbol, ...)

メソッドがオブジェクトに定義されていなかったときにこのメソッドが 呼ばれる。これを使って自分の知らないメソッドをほかのオブジェクト に委譲することができる。

例:

def hoge.method_missing(message, *arg)
    @to_obj.send(message, *arg)
end


rubyist ML