アヒルは多型のサブセットを入力しています


17

WIkipediaの多態性から

コンピュータサイエンスでは、ポリモーフィズムはプログラミング言語の機能であり、さまざまなデータ型の値を統一されたインターフェイスを使用して処理できます。

ウィキペディアのカモタイピングから

オブジェクト指向プログラミング言語を使用したコンピュータープログラミングでは、ダックタイピングは、特定のクラスまたは特定のインターフェイスの実装からの継承ではなく、オブジェクトの現在のメソッドとプロパティのセットが有効なセマンティクスを決定する動的なタイピングのスタイルです。

私の解釈では、アヒルのタイピングに基づいて、オブジェクトのメソッド/プロパティが有効なセマンティクスを決定します。オブジェクトの現在の形状が、保持するインターフェースを決定することを意味します。

ポリモーフィズムから、インターフェイスを維持している限り、複数の異なるデータ型を受け入れる場合、関数はポリモーフィックであると言えます。

したがって、関数が型をダッキングできる場合、複数の異なるデータ型を受け入れ、それらのデータ型に正しいメソッド/プロパティがあり、インターフェースを維持している限り、それらを操作できます。

(インターフェースという用語の使用は、コード構成ではなく、記述的で文書化された構成としての意味です)

  • ダックタイピングとポリモーフィズムの正しい関係は何ですか?
  • 言語がタイプをダッキングできる場合、それは多態性を実行できることを意味しますか?

1
あなたが答えで何を探しているのか分かりません。あなたは両方を正確に定義したので、あなたはそこにあるのと同じくらい決定的な答えを持っています。多型としてカモタイピングを「カウント」するかどうかは、哲学的な質問か、そういう意味であれば用語の質問かもしれません。それで、あなたは答えに何を探していますか?
psr

@psr私は基本的に「ここでそれをどう解釈するか。私は間違っていますか?私は正しいですか。それを何らかの方法でそれを言う尊敬できる学者がいます。基本的に「カモタイピングはポリモーフィズムの実装/サブセット」以外の詳細については、関係について他に何を言うことができますか?
レイノス

私が理解している限り、ホモグラフィは、ダックを均一なインターフェース以外のものに入力します=>ポリモーフィズムではなく、または少なくともウィキペディアがそれを定義するという意味ではありません。例えばdoor.close()tiger.close()
ブヨ

4
アヒルのタイピングは、アドホックポリモーフィズムの例です。あなたはこれを考えすぎています。
ヤニス

回答:


16

ポリモーフィズムは一般的な特性であり、いくつかの方法で実装できると言います。

  • クラスベースの継承。
  • プロトタイプベースのオブジェクト(継承ありまたはなし)
  • アヒルタイピング
  • インターフェイスの準拠(Goのインターフェイスによって行われ、C ++テンプレートで暗黙的に行われます)

それらのそれぞれにより、プログラマーは異なるタイプの単一のコードを使用できるため、すべてがポリモーフィズムの概念を具現化します。


7

私は思う:

アヒルのタイピングとポリモーフィズムはどちらも間接化/抽象化の手段です。ポリモーフィズムは型とタイピングに基づいた概念ですが、アヒルのタイピングは契約に基づいています。

ポリモーフィズムでは、THINGが何であるかが重要であり、その振る舞いは重要ではありません(振る舞いは、それが何であるかの結果かもしれません)。

アヒルのタイピングでは、THINGの動作が重要です。アヒルのタイピングは、定義済みのプロパティを持つオブジェクトではなく、メッセージを交換するアクターとしてのオブジェクトの概念により密接に関連しています。


2
これは間違っています。ポリモーフィズムは、多くのものをカバーする巨大な傘です。特に、アヒルのタイピングをカバーしています。したがって、アヒルのタイピングは多型の一形態です。
トーマスエディング14

同意しません。動作メソッドを使用した従来の継承には、同じ特性があります。オブジェクトの動作が保証されていることを明示することにより、タイプセーフになります(他の動作を除外しません!)
marstato

6

答えはYESです。

Duck Typingは動的型付けの特殊なケースであり、動的型付け自体を直接ポリモーフィズムと見なすことができない場合でも(コンパイル時ではなく実行時に型チェックを実行する言語のプロパティであるため)、通常は動的型付けの根底にあり、このような遅延バインディング動的ディスパッチ多型の特徴です。


Wikipediaの記事と最近の用語の使用に関する問題は、最初に見たときにアヒルのタイピングが意味するもの(つまり、タイピングの形式)を定義するのではなく、メソッドを呼び出して定義されていない場合のランタイムエラー。Eric Lippertが説明しているように、それはタイピングではなく、タイピングの欠如です。
reinierpost

1

ポリモーフィズムには明示性が必要なため、アヒルのタイピングはポリモーフィズムのサブセットではありませんが、これはアヒルのタイピングでは失われます。したがって、アヒルのタイピングは、セマンティックに意味があるためではなく、同じシグネチャを持っているため、「インターフェイス」を「実装」する可能性があります。アヒルのタイピングがポリモーフィズムのサブセットである場合、明示的な宣言を含む、ポリモーフィズムのすべてのプロパティがあります。

ダックタイピングも実際にはポリモーフィズムの実装ではなく、別のタイプシステムの一部です。通常、ダックタイピングを、先に進み、オブジェクトがそれを処理できるかどうかを知らずにオブジェクトにメッセージを渡す動的言語に関連付けます。もし可能であれば、アヒルタイピングテストに効果的に合格します。通常、ポリモーフィズムは、vtables(およびインターフェイスがクラスと異なる場合はitables)をセットアップすることにより、コンパイル時に実装されると考えています。しかし、たくさんの言語があり、これらの機能を実装する方法はたくさんあります。

ある程度これは哲学的な質問です。アヒルの型付けは、暗黙的に自動的に宣言されるインターフェイスと考えることができますか?間違っている理由を正確に考えることはできませんが、おそらくそれを見て最も生産的な方法だとは思いません。アヒルのタイピングとインターフェイスはどちらも、プログラミング言語のタイプシステムでよく見られる特徴であり、どちらも動作方法がかなり似ており、プログラマーが理解するために重要です。


6
「ポリモーフィズムには明示性が必要です」と言っているのはどこですか?クラスベースの継承はポリモーフィズムの一種であり、唯一のものではありません。
ハビエル

そして、@ Javierのコメントを続けて、アドホックなポリモーフィズムはどうですか?
ヤンニス

@YannisRizos-このような質問に答える際の問題は、あなたが何を言っても、誰かがあなたを奪うかもしれないほど多くの言語と非常に多くの用語があることです。「アドホックポリモーフィズム」の名前に「ポリモーフィズム」という言葉が含まれている理由は理解できますが、OPが「ポリモーフィズム」によって意味するもの以外の何かだと主張します。
psr

@Javier-あなたがリストしたすべてのメソッドは、アヒルのタイピングを除く明示性を必要とします。
psr

@psr実際、OPが「ポリモーフィズム」とはどういう意味かは気にしません。私は誰も気にするべきではないと思います、それは非常に単純な定義を持つ科学的概念です、私たちは私たち自身の解釈または私たちがOPsの解釈だと思うかもしれないことに基づいて答えるべきではないと思います。特にOPsの解釈は、デフォルトで彼が解釈について不明な点を尋ねているためです。それは哲学的な質問であることに同意しません。述べられた質問は科学的なものであり、1つの簡単な答えがあります。
ヤンニス

1

「はい、fooにダックタイピングがあれば、fooにはポリモーフィズムがあります」と言うのは自然なことです。しかし、このようなシステムの人工的な例を思いつくことできるかもしれないという意味で、この100%確かなことを言うことはできません(「カチカチできるか、水に浮くことができますか==>アヒル」)ポリモーフィズムはありませんが(「foo、quack!」は失敗します)、実際には人工的であり、現実の世界では、「はい、アヒルタイピングが存在する場合、ポリモーフィズムも存在する必要があります」と言います。

個人的には、ダックタイピングは「多態性が正しく行われている」と考えています。つまり、アヒルのタイピングの世界に存在するものは、明示的な型を持つ必要がなく、それらの(ポリモーフィック= "同じアクセス、異なる結果")の振る舞いだけが重要です。ポリモーフィズムの他の実装では、型/インターフェイス/継承に制約されるため、「ポリモーフィズム自体」ではなく「実装および制約されるポリモーフィズム」です。


0

静的に型付けされたプログラミング言語を使用すると、すべての型の一貫性チェックが実行時に実行される言語よりも、エラーチェックを早くし、統制されたプログラミングスタイルをより効果的に実行し、より効率的なオブジェクトコードを生成できます。

(B.ピアス&フレンズ)

注目できるように、この点に関して、アヒルのタイピングは動的タイピングであり、そうでなければこれらはまったく実行されません。

ポリモーフィングに関連する型を決定する方法がいくつかあります。たとえば、コードをより柔軟にしますが、これらの場合、ダックタイピングは完全に別の問題です。

詳細には、計算と計算のプロパティを決定するのに役立つ型付きラムダ計算と型なしラムダ計算があります。

また、結果をすばやく取得したい場合は、ダックタイピングなどが役立つことがわかりますが、動的な性質によりニーズに合わせて調整できるため、より高速に計算できることもあります。親愛なる、私が既に何を計算したいのかを本当に知っているなら、タイピングが最善であると言うだけだと思いますが、なぜ私が欲しいのか知っているのですか?へへへ...

それが私の5セントであり、興味深い研究トピックを作成できると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.