「ダックタイピング」の 2 つの異なる定義に遭遇しました。どちらかが「正しい」で、もう一方が「正しくない」と言う人がいるに違いありません。どちらも「正しい」とは言いませんが、個人的には、より広い意味で間違っているとは思いません。
1) 実行時のみの型付け。型は変数ではなくオブジェクトのプロパティであるため、必然的にオブジェクトのメソッドを呼び出すとき、またはオブジェクトがその型によって持つプロパティを使用するとき、そのメソッドの有無は実行時に発見されます[* ]。したがって、「アヒルのように見え、アヒルのように鳴く」場合 (つまり、quack()
機能があることが判明した場合)、それは「アヒル」です (とにかく、アヒルのように扱うことができます)。もちろん、この定義により、C++ テンプレートは最初のハードルに落ちます。静的型付けを使用します。
2)アヒルのように見え、アヒルのように鳴く場合、それはアヒルであるという原則に対してより一般的に使用される名前。プロデューサーによって明示的にアドバタイズされているインターフェースよりも(インターフェースを実装するものは何でも)。この定義によると、C++ テンプレートは一種のダックタイピングを使用しますが、何かが「アヒルのように見える」かどうかは、動的な型ではなく静的な型に基づいて、実行時ではなくコンパイル時に決定されます。「コンパイル時にチェックしてください。この変数の静的型はクワックできますか?」ではなく、「実行時にチェックします。このオブジェクトはクワックできますか?」。
この論争は、Python がこの用語を「所有」しており、Python のような型システムだけをダックタイピングと呼ぶことができるかどうか、または他の人がこの用語を別のコンテキストで同様の概念を意味するように自由に流用できるかどうかに関するものであるように私には思えます。 . あなたがそれが意味するべきだと思うものは何でも、「冗談」の用語を使用して、誰もがそれから同じ正式な定義を理解することを要求するのは無責任に思えます. SO は、「あるべき」という用語が何を意味するかを説明するのに適したフォーラムではありません。ただし、辞書やそれを正式に定義している学術論文など、質問している信頼できる情報源がない限りはそうです。それが実際に何を意味していたのかを教えてくれると思います。
「汎用プログラミング」は、正確な詳細に応じて、ダックタイピングを利用することもしないこともできます。C++ の一般的なコンテナーは、「タイプ 2」のダックタイピングを使用します。これは、C++ の一般的な型の場合、コピー、比較、ハッシュ値の取得などを実行できることが保証されていないためです。Java の一般的なコンテナーはそうではなく、Object
既に十分なメソッドがありますハッシュ可能にするなど。
逆に、ダックタイピングを使用するものはすべて、「ジェネリックプログラミング」と呼ぶのが妥当だと思います。したがって、あなたが求めた用語では、そのダックタイピング(定義のいずれか)の GP > DT は、「ジェネリック」と呼ぶことができる膨大な範囲のものの厳密なサブセットであると思います。
[*] 場合によっては、動的言語に何らかの方法でケースを証明する静的分析が含まれる場合がありますが、言語では、静的分析で最終的に判断できない場合に実行時までこのチェックを延期する機能が要求されます。