まつもと ゆきひろです

In message "[ruby-list:4227] Re: Mini ML Program"
    on 97/09/09, Kikutani Makoto <kikutani / jdc.ericsson.se> writes:

|なるほど。この場合のsuperが、自分のinitializeというのが
|ちょっとわかりずらいのです。スーパークラスが自分のクラス?

どこがわかりずらいのかが,よくわからなかったのですが,rubyに
おける一般的なオブジェクトの生成と初期化は以下のようなステッ
プで行われます.

    Cmail.new

  でクラスCmailのメソッドnewが呼ばれる.

    super

  でクラスCmailから見て上位のクラス(あるいはincludeされている
  モジュール)で定義されている同名のメソッドが呼ばれる(この場合
  はnew).

  クラスClassにはメソッドnewが定義されているので,Class#newが
  呼ばれる.

  Class#newは新しくオブジェクトを生成し,そのオブジェクトの
  initializeメソッドを呼ぶ(引数はnewに渡されたものと一緒).

  ユーザが定義したinitializeの中で必要な初期化が行われる.デフォ
  ルトのinitialize(Object#initialize)はなにもしない.ユーザ定
  義initializeの中でスーパークラスの初期化ルーチンを起動したい
  時にはsuperを使ってスーパークラスのinitializeを呼び出す.

となっています.

|あと、rubyではコンストラクタの引数の数によって挙動を
|変えるというのはできますか?

rubyにはC++の引数による多重定義(overloading)のようなことはで
きませんが,オプショナル引数や引数をまとめて配列としてうける
ことができますので,引数の数や型によってメソッドの中で分岐す
ることが出来ます.

オブジェクトの初期化を変えるだけでしたら,initializeの中で分
岐すれば良いでしょうし,生成方法そのものを変えようと思えば,
newを再定義する必要があるかも知れません.

                             うぅ,良い実例が思いつかなかった
                                まつもと ゆきひろ /:|)