ダック・タイピング
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ダック・タイピング(duck typing)とは、Smalltalk・Python・Rubyなどのいくつかの動的型付けオブジェクト指向プログラミング言語に特徴的な型付けの作法のことである。それらの言語ではオブジェクト(変数の値)に何ができるかはオブジェクトそのものが決定する。つまり、オブジェクトがあるインタフェースのすべてのメソッドを持っているならば、たとえそのクラスがそのインタフェースを宣言的に実装していなくとも、オブジェクトはそのインタフェースを実行時に実装しているとみなせるということである。それはまた、同じインタフェースを実装するオブジェクト同士が、それぞれどのような継承ヒエラルキーを持っているかとは関係なく、相互に交換可能であるという意味でもある。
この用語の名前は「ダック・テスト」に由来する。
"If it walks like a duck and quacks like a duck, it must be a duck"
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである)
デーブ・トーマスはRubyコミュニティで初めてこの言葉を使ったと考えられている。
C++のtemplateはダック・タイピングの静的版である。例えば、iteratorはIterator基底クラスのようなものからメソッドを継承しているわけではない。
もう1つ、ダック・タイピングに似たアプローチにOCamlのstructural subtypingがある。メソッドのシグネチャが互換ならば、宣言上の継承関係は関係なく、オブジェクトの型も互換であるというものである。これはOCamlの型推論システムによってコンパイル時にすべて決定される。
[編集] Rubyでの例
Rubyでの単純な例を示す。
def test(foo) puts foo.sound end class Duck def sound 'quack' end end class Cat def sound 'myaa' end end test(Duck.new) test(Cat.new)
出力は以下である。
quack myaa
2つのクラスに継承の関係が無いことに注目して欲しい。
[編集] 関連項目
[編集] 外部リンク
- Duck Typing: Ruby
- How to duck type? - the psychology of static typing in Ruby
- Java Does Duck Typing 2005年4月29日
- The Perils of Duck Typing (Java)
- PythonでのGzipFileに関する例
- DuckTyping: Runtime Dynamic Interface Implementation (.NET)