はじめまして。小野寺といいます。
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>