2009-07-03 1 views
1

このような言語(C#、Javaなど)で書いたことがありますか? (アヒルタイピングに関する議論については、this questionを参照してください)強く型付けされたOOP言語でのダックタイピングの引数は?

+1

強く入力するのではなく静的に入力することを意味すると思いますか? – Kylotan

+1

キロタン、いいえ、それは矛盾します。動的<->静的、強い<->弱いです。 – Svante

+2

私が知っているのは、それが私が作っていたことです。質問の文言は、強く型付けされた言語には、アヒルのタイピングがないことを意味しています。それらのいくつかは、すなわち。 Python。 – Kylotan

答えて

2

他の質問はアヒルタイピングとはほとんど関係がありませんでした。とにかく、これが閉じていないと仮定すれば、私は本当にダックタイピングが大失敗したと言うのは、大きなAPIを使ってクラスをテストしようとするときです。別のプログラミング言語では、あなたが必要とするものの基本的な基本を実装する自己記述クラスを渡すことができますが、別のフレームワークが必要です。

たとえば、フレームワークなしでJDBC ResultSetをJavaでモックしようとすると、少し苦労します。

3

あなたが所有していないコードで作業する必要があり、適切な抽象化(HttpContext anyone?)を持たないたびに、作業する必要があります。 HttpContext型にはその種の抽象化がないので、あなたはIHttpContextを受け入れるメソッドを持つことができないので、アダプタやFactoryなどを解決する必要があります。 あなたのコードでIHttpContextコントラクトを定義し、HttpContextのようにし、IHttpContextを受け入れるようにメソッドを設定し、本当の、実際のHttpContextオブジェクトをIHttpContextに渡すことができれば、とても良いでしょう。

+0

私はあなたの最初の答えを参照してください:) – ripper234

+0

あなたはもっと頑張っていなければなりません:) –

2

1990年代からJavaを使用してきたのは、'01年以降のPythonです。

ここで私はJavaでダックタイピングを忘れたことはありません。

「ダックタイピングin Java質問」は、実際には多態性を完全に理解できないことです。ランタイム型の識別や "isinstance"機能が必要だと思ったことがあれば、多態性を把握できず、間違っています。

Programmer Ignorance Pet Peeveの質問を参照してください。多型を理解できないことは大きな問題であり、この「Javaでのダックタイピング」ミスにつながります。

多態性を理解している場合は、ダックタイピングは必要ありません。PythonとJavaを切り替えるときにそれを見逃すことはありません。

関連するノートでは、アサーションの一部としてPythonのisinstance()を使用します。これは、整数でない整数を取得するときに整数を必要とする関数を作成するためです。 isinstance()は、ダックタイピングのようなことをJavaで試みるときに使用されることがあります。

重要なのは、私が古くて(52)、それほどスマートではないということです。ですから、私はPythonで "強力な"クラス階層を維持する必要があります。そうしないと、混乱します。私は、必要になった場合、より厳密なクラス階層にリファクタリングするために、Pythonデザインに常にスペースを残しました。

+3

isinstanceを使用することはダックタイピングではなく、実際にはダックタイピングを卑下します。 クラスA {メソッドfoo(){...}} クラスB {メソッドfoo(){...}} 関数not_duck_typed(x){if(x isinstance A){x.foo()} } function duck_typed(x){x.foo()} ダックタイピングのポイントは、共通の祖先を共有していないにもかかわらず、AまたはBのインスタンスをduck_typedに渡すことができます。正式なインタフェース。ダックタイピングはまだ多型です。 –

+2

あなたは実行時の型識別/ isinstanceとダックタイピングを混同しています。 Javaでは、インターフェースは明示的に定義されています。アヒル型言語では、オブジェクトが公開するメソッドによって暗黙に定義されています。 –

0

(C#foreachの場合のように)言語が設計上の脆弱性を回避しようとする場合以外は、メソッドシグネチャに基づいてダックタイピングを実行する必要はありません。一方、インターフェイスを使用したダックタイピングに似た何かをすると役立つ多くの状況があります。たとえば、IWalkLikeDuckIQuackLikeDuckのインタフェースを実装するために制限されている汎用パラメータを持つメソッドUseDuckがある場合、IWalkLikeDuckIQuackLikeDuckの両方を実装するように制約されている汎用タイプの変数はUseDuckに渡すことができます。しかし、コードが終了したらWowzoに渡すことができる形式でコードを永続させるための良い方法はありません。他の両方のインターフェースから継承されたダックタイプのIWalkAndTalkLikeDuckを定義できれば、IWalklikeDuckITalkLikeDuckの両方を実装するクラスによって自動的に実装されると見なされるので、は非常に参考になります。 IWalkLikeDuckおよびITalkLikeDuckList<IWalkAndTalkLikeDuck>に実装することがわかっていたすべてのタイプ。

関連する問題