ダック・タイピング
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/17 16:02 UTC 版)
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つのクラスに継承の関係が無いことに注目して欲しい。上記のtest
メソッドは、sound
という名前のメンバーを持つオブジェクトであれば何でも受け付ける。なお、Rubyのputs
は引数オブジェクトを自動的に文字列に変換して標準出力に出力する[12]ため、仮に文字列以外を返すsound
であっても受け付ける。このような柔軟性が動的言語の特徴である。
C++での例
上記Rubyの例をC++で記述すると、以下のようになる。
#include <iostream>
template <class T>
void test(const T& t) {
std::cout << t.sound() << std::endl;
}
struct Duck {
const char* sound() const {
return "quack";
}
};
struct Cat {
const char* sound() const {
return "myaa";
}
};
int main() {
test(Duck());
test(Cat());
}
実行結果はRubyの例と同じである。ただし、テンプレートによるダック・タイピングはコンパイル時に解決される静的なポリモーフィズム (static polymorphism) であり、動的型付け言語とは異なり実行時のオーバーヘッドを伴わない。
C#での例
C#はバージョン4.0で動的型付けを可能にするdynamic
型が使えるようになった。dynamic
は内部的にはリフレクションを利用して実装されており、該当するメソッドやプロパティの存在有無を実行時に遅延評価する。シンボル解決に失敗した場合は例外がスローされる[13]。
using System;
class Duck {
public string Sound() {
return "quack";
}
}
class Cat {
public string Sound() {
return "myaa";
}
}
public class DuckTypingTest {
static void Test(dynamic obj) {
Console.WriteLine(obj.Sound());
}
public static void Main() {
Test(new Duck());
Test(new Cat());
}
}
なお、C#はC++のテンプレートに似た機能としてジェネリクスをサポートするが、C++テンプレートほどの柔軟性はなく、ダック・タイピングに使用することはできない[14]。
注釈
- ^ nominalは名目的または記名的とも訳される。
出典
- ^ “Python Duck Typing - Example” (英語). Techie Hours (2020年6月28日). 2020年7月26日閲覧。
- ^ a b Python Software Foundation. “Glossary — Python 3.7.1 documentation, §duck-typing”. docs.python.org. 2018年11月8日閲覧。
- ^ Dynamic typing vs. static typing | Oracle
- ^ Benjamin C. Pierce「第15章 部分型付け」『型システム入門 −プログラミング言語と型の理論−』オーム社、2013年3月26日。ISBN 978-4274069116。
- ^ Objects and Aspects: Row Polymorphism | Neel Krishnaswami, Department of Computer Science, Carnegie Mellon University
- ^ 実例によるPureScript
- ^ OCamlで構築するモダンWeb:型付きHTML5プログラミングの実際 | 有限会社ITプランニング | 今井 敬吾
- ^ Benjamin C. Pierce「19.3 名前的型システムと構造的型システム」『型システム入門 −プログラミング言語と型の理論−』オーム社、2013年3月26日。ISBN 978-4274069116。
- ^ typingは「型付け」と訳されることが多いが、subclassingは「サブクラス化」と訳されることが多い。subtypingは「部分型付け」や「サブタイプ化」としてもよいかもしれないが、本記事ではduck typingを「ダック・タイピング」とカナ表記しているのでそれに準じることにする。
- ^ TypeScript: Documentation - Type Compatibility
- ^ Python Software Foundation. “Glossary — Python 3.10.1 documentation, §abstract base class”. docs.python.org. 2021年12月19日閲覧。
- ^ Kernel.#puts (Ruby 3.0.0 リファレンスマニュアル)
- ^ dynamic 型の使用 - C# プログラミング ガイド | Microsoft Docs
- ^ Differences Between C++ Templates and C# Generics - C# Programming Guide | Microsoft Docs
- ^ Object Variable Declaration - Visual Basic | Microsoft Docs
- ^ Early and Late Binding - Visual Basic | Microsoft Docs
- ^ Java Core Reflection
- ^ IDispatch Interface and Accessibility - Windows applications | Microsoft Docs
- ^ IDispatchEx Interface | Microsoft Docs
固有名詞の分類
- ダック・タイピングのページへのリンク