Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 |

2006-12-01(Fri)

親クラスのメソッド呼出

Ruby勉強

掲示板で質問した内容、自身でオーバーライドしたメソッドの親クラスオリジナルメソッドを呼び出す方法

classBのインスタンスで通常メソッドfooを呼ぶと自身でオーバーライドされたメソッドが実行されてしまうので、オーバーライド前にaliasしておき、そちらを呼ぶことで実現する。

関連情報


class A
  def foo
    puts "foo in A"
  end
end
class B<A
  alias :foo_A :foo    # def fooよりも前にあることがポイント
  def foo
    super
    puts "foo in B"
  end
  def bar
    foo_A              # class Aのメソッドfooが呼ばれる
    puts "bar in B"
  end
end

B.new.bar
#=> foo in A
#=> bar in B

こんな方法も(まだ理解不能)

  def bar
    a_foo_unbound = self.class.superclass.instance_method(:foo)
    a_foo = a_foo_unbound.bind(self)
    a_foo.call
  end

ujipujip 2006/12/02 08:18 rubyプログラムするときにはこの問題は確かにぶち当たりそうですよねぇ。
super.fooみたいな書き方ができるといいですけどねぇ。

hakehake 2006/12/02 09:49 自分もsuper.fooで書けると思っていたんですよね。
できなくてマイッタ(笑)
オーバーライドの方法を工夫しろと言われてしまえばそれまでですけど(^^ゞ

ujipujip 2006/12/03 07:52 aliasで逃げるのはちょっとショックですね。
super.fooが自然だと思うんだけどなぁ。まつもとさんに言うしかないのか?
superは当該メソッドのオーバーライド先のメソッド呼出専用なんですよね。
superはメソッドであって、親クラスのインスタンスではないんですよね。
なんかこれがそのなんというか、不便というか、不自然というか。
やっぱり、まつもとひろゆきさんにいうしかないかなぁ。

hakehake 2006/12/03 13:29 多分、言語の仕様でいろいろとあるのだと思います。
この場合は一緒に教えていただいた、日記の下の方法を使用するのが正しいのでしょうね。
ただ初心者にはとっつきにくい方法ではありますが(^^ゞ

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hake/20061201/p2
リンク元