あおきです。
In Mail "[ruby-list:12048] Re: What's DelegateClass ?"
gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro) wrote:
> ごとけんです
> 前々から気になってたんですが,<dt> に <h1> が
> 来るのは HTML 的に間違いです.各ドキュメントの一番
> 外側の<dl> はいらないと思うのですが,どうでしょう??
ぼくも書いていて何かおかしいと思っていたのですが
やっぱり違うんですね。なおしておきます。
> >ちなみに、このクラスには下位互換性のためにDelegaterという別名
> >があります。
>
> これはいらないのでは??
削ります。
ご指摘ありがとうございます。
あまり変更はありませんがあまり大きくないので全部つけます。
-------------------------------------------------------------------
あおきみねろう@一橋大学
mail to: aamine / dp.u-netsurf.ne.jp
website: http://www1.u-netsurf.ne.jp/~brew/mine/
===================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY text="#000000" bgcolor="#FFFFFF">
<HR>
<H1><a name="Delegator">Delegator</a></H1>
<P>
クラス階層とは関係なく、他のオブジェクトのインターフェイス・
実装を利用する(以下、delegate)ための抽象クラスです。
Delegatorクラスはオブジェクト単位のdelegateを行うためのクラス
なので、クラス単位でdelegateをするときには、DelegateClass
メソッドを使ってください。
</P>
<h2>スーパークラス:</h2>
<ul>
<li><A HREF="Object.html"><code>Object</code></A>
</ul>
<h2>クラスメソッド:</h2>
<DL COMPACT>
<DT>
<A NAME="Delegator.new"><CODE>new([<VAR>obj</VAR>])</CODE></A>
<DD>
<p>
引数<code>obj</code>にはdelegateしたいオブジェクトを渡します。
下位クラスで<code>initialize</code>を再定義するときは必ず
<code>super</code>を呼びだす必要があります。
</p>
<p>
また、メソッドhash、eql?はdelegateされないので、Delegator
の下位クラスのインスタンスをHashのキーに使うときは、この
ふたつのメソッドを再定義してください。具体的には、
<blockquote><pre>
obj.eql? Delegator.new( obj )
obj.hash == Delegator.new( obj ).hash
</pre></blockquote>
の両方が成立する必要があります。
</p>
</DL>
<h2>メソッド:</h2>
<DL COMPACT>
<DT>
<a name="__getobj__">__getobj__</a>
<DD>
<p>
下位クラスでは目的にあわせてこのメソッドを再定義しなければ
いけません。このメソッドが再定義されないままだと、そのクラス
のメソッドが呼ばれたときに例外NotImplementErrorが発生します。
</p>
</DL>
<h2>用例:</h2>
<blockquote><pre>
#!/usr/local/bin/ruby
require 'delegate'
class SimpleDelegator < Delegator
# SimpleDelegatorの定義そのまま。
# 他に例が思いつかないところが苦しい
def __getobj__
@obj
end
def __setobj__( obj )
@obj = obj
end
def initialize( obj )
super
__setobj__( obj )
end
end
dele = SimpleDelegator.new( STDOUT )
dele.write 'this is from delegated STDOUT' # STDOUTに出力される
</pre></blockquote>
<HR>
<H1><a name="SimpleDelegator">SimpleDelegator</a></H1>
<P>
SimpleDeletatorクラスは、クラス作成時または__setobj__であたえた
オブジェクトのdelegateを行うクラスです。
</P>
<h2>スーパークラス:</h2>
<ul>
<li> <A HREF="#Delegator"><code>Delegator</code></A>
</ul>
<h2>クラスメソッド:</h2>
<DL COMPACT>
<DT>
<A NAME="SimpleDelegator.new"><CODE>new([<VAR>obj</VAR>])</CODE></A>
<DD>
<p>
引数objにはその実装を利用したいオブジェクトを渡します。
</p>
</DL>
<h2>メソッド:</h2>
<DL COMPACT>
__getobj__
<DT>
<a name="__getobj__">__getobj__</a>
<DD>
<p>
このクラスでは単にインスタンス変数に格納されているオブジェクトを
渡すだけです。
</p>
<DT>
<a name="__setobj__"><code>__setobj__(<var>obj</var>)</code></a>
<DD>
<p>
delegateを行うオブジェクトをobjに変更します。
</p>
</DL>
<h2>用例:</h2>
<blockquote><pre>
#!/usr/local/bin/ruby
require 'delegate'
require 'socket'
class SMTPsocket < SimpleDelegator
def initialize( host = 'localhost', port = 25 )
# 組みこみクラスでインスタンス変数が使える。
# 現状で一番有効な利用法という話もある。
@sock = TCPsocket.open( host, port )
# 忘れてはいけない
super( @sock )
end
# 定義をいろいろ書く…
end
</pre><blockquote>
<HR>
<dl>
<dt><code>DelegateClass(<var>dele_class</var>)</code>
<dd>
<P>
第一引数に与えられたクラスのクラスメソッド・メソッドを
ほぼ全て持った名無しクラスを新しく作ってそれを返します。
またそのクラスでは、必ずinitializeでdele_classのインス
タンスをsuperに渡さなければいけません。
</P>
<dt>用例
<dd>
<blockquote><pre>
#!/usr/local/bin/ruby
require 'delegate'
class NilArray < DelegateClass( Array )
def initialize
super( [] )
# Arrayは組みこみクラスなので今のところインスタンス
# 変数は使えないが、Delegateされたクラスなら
# インスタンス変数が使える
@a = 1
end
def []( idx )
# 常にnilをかえすように変更してみる
return nil
end
end
obj = NilArray.new( 3 )
p obj.type # Array
obj.push 1
p obj[ 0 ] # nil (ちゃんと変更されている)
p obj # [ 1 ]
p obj.pop # 1
</pre>
</blockquote>
</dl>
<HR>
</BODY>
</HTML>
==============================================================