• 締切済み

ダック・タイピングのメリット

Rubyには「ダック・タイピング」が可能とのことを知りました。 しかしその有用性がわかりません。 ダック・タイピングのメリットを教えてください。 Wikipediaには以下のように書いてありました。 ダック・タイピング - Wikipedia http://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83%E3%82%AF%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0 「オブジェクトがあるインタフェースのすべてのメソッドを持っているならば、たとえそのクラスがそのインタフェースを宣言的に実装していなくとも、オブジェクトはそのインタフェースを実行時に実装しているとみなせる」 とりあえず意味はわかりました。しかし、すべてのメソッドを実装する努力をしながらインターフェイスの宣言をしないメリットがわかりません。そのインターフェイスを使うことがわかっているのなら宣言すればいい話だと思いますし、宣言を記述しなくて済むというメリットしかないということもないと思います。 ダック・タイピングのメリットを教えてください。 よろしくお願いします。

みんなの回答

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

> ダック・タイピングのメリットを教えてください。 メリットはリンク先に書かれている 「オブジェクト(変数の値)に何ができるかはオブジェクトそのものが決定する」ではないでしょうか。 リンク先のRubyスクリプト例で言えば、testの引数に与えられるオブジェクトにsoundというメソッドが在りさえすれば、それに応じた戻り値を返すということです。 > 「オブジェクトがあるインタフェースのすべてのメソッドを持っているならば、(以下略)」 については以下のようなスクリプトでは如何ですか def test(foo) puts foo.sound end class Duck def sound 'quack' end end class Cat def sound 'myaa' end end dog = String.new("pochi") def dog.sound 'bow' end test(Duck.new) # => quack test(Cat.new) # => myaa test(dog) # => bow Stringというクラスは、soundというメソッドを実装していませんけれども、dogというオブジェクトはsoundメソッドを持っているので"bow"という値を返します。

mibusys
質問者

お礼

反応非常に遅くて失礼しました。 いまさらながらになんとなくわかりました。 この部分は、 def test(foo) puts foo.sound end 引数で渡されるfooはsoundというメソッドを持っているかどうかは 保証されないということですね?(Javaばっかりの人なので意味がわかりませんでした) 仮にfooにsoundがなかった場合には Javaだったらコンパイル時にエラーになる、実行前に保証されている、 Rubyだったら実行時にエラーになる、実行するまでわからない。 でも、1つのインターフェイスでメソッドの有無を保証しなくとも 実装者がきちんと書いてくれれば、インターフェイスを限定しなくとも いいじゃん。そのほうが柔軟で便利でしょということですね。タブン。 なんというか理念の違いのようなものなのでしょうかね。 Rubyはまったくわからないために時間がかかりましたがようやくわかりました。 ありがとうございました。

関連するQ&A