メソッドの委譲(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]
与えられたオブジェクトの持つメソッドに関して委譲用のメソッド定義を 提供するクラス。
コンストラクタで指定されたオブジェクトのもつインスタンスメソッドのうち、
自分の持たないメソッドについて、
__getobj__
が返すオブジェクトに実行を委譲するようメソッドを定義する。
Delegator#initialize(obj)
objのもつインスタンスメソッドのうち、
自分の持たないメソッドについて、
__getobj__
が返すオブジェクトに実行を委譲する
ようインスタンスメソッドを定義する。
Delegator#__getobj__
委譲先のオブジェクトを返す。 デフォルトではNotImplementErrorを発生するので、サブクラスで 再定義する必要がある。
Delegatorクラスをそのまま利用した、 指定したオブジェクトにメソッドを委譲するクラス。
Delegator
SimpleDelegator#__getobj__
委譲先のオブジェクトを返す。
SimpleDelegator#__setobj__(obj)
委譲先のオブジェクトをobjに変更する。
委譲するメソッドの定義は生成時にのみ行われるため、 以前の委譲先オブジェクトとobjの間でインスタンスメソッドに 違いがあっても、 委譲するインスタンスメソッドの再設定は行われないことに注意。