17

Goがインターフェイスをどのように処理するかを見て気に入った後、C#で次のような同様のダックタイピングを実現する方法について考え始めました。

var mallard = new Mallard(); // doesn't implement IDuck but has the right methods
IDuck duck = DuckTyper.Adapt<Mallard,IDuck>(mallard);

このDuckTyper.AdaptメソッドはSystem.Reflection.Emit、その場でアダプターを作成するために使用します。多分誰かがすでにこのようなものを書いています。モックフレームワークがすでに行っていることとそれほど変わらないと思います。

ただし、実際に適切なメソッドMallardがない場合、実行時に例外がスローされます。IDuckコンパイル時の早い段階でエラーを取得するには、MallardToDuckAdapter回避しようとしているものとまったく同じものを作成する必要があります。

もっと良い方法はありますか?

編集:どうやら私が「安全なダックタイピング」と呼ぶものの適切な用語は構造的タイピングです。

4

4 に答える 4

14

目の前に生きている呼吸している牛がいない場合、牛がアヒルのように歩き、アヒルのように鳴くかどうかをどうやって知ることができますか?

ダックタイピングは、実行時に使用される概念です。コンパイル時の同様の概念は、CLRでサポートされていないAFAIKである構造型です。(CLRは、記名的型付けを中心としています。)

[構造型システム]は、明示的な宣言または型の名前に基づいて比較が行われる記名的システムや、実行時にアクセスされる構造の一部のみの互換性がチェックされるダックタイピングとは対照的です。

ダックタイピングが実行時に例外をスローしないことを確認する通常の方法は、単体テストです。

于 2009-11-13T17:28:11.033 に答える
5

C#のDuckTyping

Reflection.Emitは、元のオブジェクトを直接呼び出すILを放出するために使用されます

このライブラリがコンパイル時のエラーを考えさせてくれるとは思いません。それが完全に実行可能かどうかはわかりません。ユニットテストを使用して、それを補います。

于 2009-11-13T17:25:04.377 に答える
1

暗黙のインターフェイス(Goインターフェイスとは何か)がVB 10(C#についてはわかりません)で計画されていることを私は知っています。残念ながら、リリース前に廃棄されました(ベータ版にさえならなかったと思います…)。それらが.NETの将来のバージョンで登場するかどうかを確認するのは素晴らしいことです。

もちろん、新しいdynamic型を使用してほとんど同じことを実現できますが、これはまだ同じではありません。暗黙のインターフェイスでも強い型付けが可能であり、これは重要だと思います。

于 2009-11-13T17:34:39.477 に答える
1

コンパイル時エラーが発生する別の方法はないと思います。

ただし、これはユニットテストに最適です。ユニットテストを作成して、次のことを確認します。

DuckTyper.Adapt<Mallard, IDuck>(mallard);

正常にマップします。

于 2009-11-13T17:30:26.347 に答える