はじめまして。小野寺といいます。

Redhat 7.1 + Ruby 1.6.7 を利用しています

質問はサブクラスのオブジェクト生成時に、スーパークラスの初期化を行うには
どのようにしたらよいのかということについてです

Socketクラスを継承した独自のUDPソケットクラスを作ろうとしていときに
スーパークラスであるSocketがうまく初期化できない問題が起きました

require 'socket'
class TestSock < Socket
   def initialize
     super Socket::AF_INET, Socket::SOCK_DGRAM, 0
   end
end
sock = TestSock.new

上記のコードを実行すると以下のようなエラーが出ます
testsock.rb:7:in `new': wrong # of arguments(0 for 3) (ArgumentError)
        from testsock.rb:7

"スーパークラス(Socket#new)が引数を必要とするので、 サブクラスの
 initialize内からsuperでスーパークラスのinitializeに引数を渡してやる"
ということを意図して上記のコードを書いたのですが、どうもTestSock#newが
呼ばれずにSocket#newが呼ばれているだけのような感じがします


試しに以下のようなスクリプトを作って実行したところ
こちらはサブクラスのinitialize内でコールしたsuperがうまく動作しました

class Foo
   def initialize( a, b, c )
      puts 'Foo#initialize Called'
      @a, @b, @c = a, b, c
   end
   def put
      puts @a,@b,@c
   end
end

class Bar < Foo
   def initialize
      puts 'Bar#initialize Called'
      super 1, 2, 3
   end
end

bar = Bar.new
bar.put

=====  実行結果  =====
Bar#initialize Called
Foo#initialize Called
1
2
3
======================


私が不勉強なため各クラスの初期化順番等を把握していないせいなのかもしれ
ませんが、Cのrb_define_class()で生成したクラスとスクリプト内で生成した
クラスとでは、Cで生成したクラスの方が優先的に初期化されたりするのでしょ
うか

現在は素直にUDPSocketを使っているので問題はないのですが、
自分では解決できなかったのでポストしました

よろしくお願いします

-- 
Onodera Takafumi <onodera-tak / mub.biglobe.ne.jp>