• 締切済み

【ruby】【文法】スパークラスのスーパークラスのメソッドを呼び出したい

スパークラスのスーパークラスのメソッドを呼び出したいです。 たとえば、Hoge3のスーパークラスがHoge2で、さらにそのスーパークラス がHogeの時、Hoge3からHogeのメソッドを呼び出したいのです。 もう少し具体的に説明させてもらいます。 class Hoge  def initialize()   @name='hoge'  end end class Hoge2 < Hoge  def initialize()   super   @name='hogehoge'  end end class Hoge3 < Hoge2  def initialize()   super #これではスーパークラスHoge2のメソッドが呼ばれてしまう。   puts @name  end Hoge3.new() 上記実行結果は、hogehogeが出力ですが、 スーパークラスのスーパークラスが設定した@name値、 'hoge'が出力されるようにしたいです。 『Hoge3クラスはHoge2クラスを継承すればよいではないか?』 とも思うでしょうが、Hoge2クラスには、Hogeには無い機能が多く拡張されてると考えてください。 ご指導のほど、宜しくお願いいたします。

みんなの回答

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.4

そもそも、Hoge3でsuperを呼ぶのがダメというか呼び出す必要ないのでは。 Hogeと同じinitializeコードをコピー&ペーストするなり、 Hogeのインスタンスをコンポジットして、(必要があれば特異メソッドを定義して)Hogeから情報を引っ張り出してくるとか。 毒を食らわば皿まで。

kingfruits
質問者

お礼

osamuyさん。ご意見ありがとうございました。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

#2です。 無理矢理やるとすると、 class Hoge  def initialize()   @name='hoge'  end end class Hoge2 < Hoge  def initialize()   super   unless self.class == Hoge3    @name='hogehoge'   end  end end class Hoge3 < Hoge2  def initialize()   super #これではスーパークラスHoge2のメソッドが呼ばれてしまう。   puts @name  end Hoge3.new()

kingfruits
質問者

補足

notnotさん、たびたびのご回答ありがとうございます。 #2での補足に記したとおりでして、 Hoge2にはできれば、手を入れたくないのです。 説明不足ですみません。 Hoge2は#2での補足で言うところの、 class ZipOutputStream に該当すので、 Hoge3でsuperした時にHoge2でsuperしたのと同じことをしたいのです。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

クラスの設計が間違っていると思いますが、どうすればいいのかはこれだけではなんとも。 >『Hoge3クラスはHoge2クラスを継承すればよいではないか?』 は、『Hoge3クラスはHogeクラスを継承すればよいではないか?』の間違いですよね。 Hoge2でいろいろメソッドが定義されているということなら、moduleにしてincludeすればいいのでは?

kingfruits
質問者

補足

notnotさん、ご回答ありがとうございます。 たびたびのご回答で、感謝しております。 >は、『Hoge3クラスはHogeクラスを継承すればよいではないか?』の間違いですよね。 すみません。誤記です。 実はこの質問、notnotさんに先日ご回答頂いた質問 http://oshiete1.goo.ne.jp/qa5307792.html から派生しております。 すごく具体的にやりたい事を書きに記します。 module Zip  class ZipOutputStream   include IOExtras::AbstractOutputStream   ・・ snip ・・   def initialize(fileName)     super()     @fileName = fileName     @outputStream = File.new(@fileName, "wb")     ・・ snip ・・ 元のソースが上記になってまして、これを以下の様にクラス継承すると した場合でして。。 require 'zip/zip' module ZipKai  include Zip  class ZipOutputStreamKai < ZipOutputStream   def initialize()    super() #※←ここ。スーパークラスのZipOutputStreamでsuperするのと同じ意味合いにしたい    @outputStream = IO.new(1, "wb") #これでは上手くいかないのは別件   ・・ snip ・・ アドバイスの程、宜しくお願いいたします。

  • siffon9
  • ベストアンサー率64% (136/211)
回答No.1

hoge2がhogeを継承する際に、aliasで別名の定義をしておいて、Hoge3ではその別名を呼べば良いのではないでしょうか。 class Hoge  def initialize()   @name='hoge'  end end class Hoge2 < Hoge  alias :hoge_initialize :initialize  def initialize()   super   @name='hogehoge'  end end class Hoge3 < Hoge2  def initialize()   hoge_initialize   #super #これではスーパークラスHoge2のメソッドが呼ばれてしまう。   puts @name  end end Hoge3.new()

kingfruits
質問者

補足

siffon9さん、ご回答ありがとうございます。 できれば、Hoge2には手を入れてくありません。 実はHoge2は、第三者提供のライブラリなもので。 説明不足ですみませんでした。 でも、アドバイスありがとうございました。

関連するQ&A