10

C# では、クラスに Interface のすべての正しいメソッド/シグネチャがあるが、次のように明示的に実装されていない場合:

class foo : IDoo {}

クラスをそのインターフェイスとしてキャストできますか?

4

5 に答える 5

17

ダックタイピング

あなたがほのめかしているのは、「ダックタイピング」と呼ばれます(「アヒルのように見え、アヒルのように鳴く場合、アヒルに違いない」というイディオムにちなんで名付けられました)。

ダックタイピングでは、(説明したように) 関連するメンバーを実装すると、インターフェイスの実装は暗黙的になりますが、.NET では現在、これに対する幅広いサポートがありません。

将来に向けて計画されている新たな動的言語機能を考えると、これが近い将来にランタイムによってネイティブにサポートされたとしても、私は驚かないでしょう。

それまでの間、リフレクションを介してダックタイピングを統合できます。このようなライブラリを使用すると、次のようなダックタイプのキャストを実行できます。IDoo myDoo = DuckTyping.Cast<IDoo>(myFoo)

トリビア

興味深いことに、今日の C# でダックタイピングが使用されている小さな場所が 1 つあります。それはforeach演算子です。Krzysztof Cwalinaforeach、クラスが演算子によって列挙可能であるためには、次のことを行う必要があると述べています。

パラメーターをとらず、2 つのメンバーを持つ型を返すパブリック メソッド GetEnumerator を提供します。a) パラメーターをとらず、ブール値を返すメソッド MoveMext、および b) オブジェクトを返すゲッターを持つプロパティ Current。

IEnumerable彼がnorについて言及していないことに注意してくださいIEnumerator。列挙可能なクラスを作成するときにこれらのインターフェイスを実装するのが一般的ですが、インターフェイスを削除して実装を残した場合でも、クラスはforeach. 出来上がり!ダックタイピング!(サンプルコードはこちら。)

于 2009-04-24T21:11:49.210 に答える
12

いいえ、Objective-C やその他の言語とは異なります。インターフェイスの実装を明示的に宣言する必要があります。

于 2009-04-24T20:48:48.873 に答える
4

IDoo に何らかのメンバーがある場合、このコードはコンパイルされません。IDoo にメンバーが存在しない場合、はい、キャストは安全です (ただし、使用は明らかに制限されています)。

于 2009-04-24T20:50:48.107 に答える
3

これには基本的に、C# でダック タイピングが機能する必要がありますが、これは自動的には行われません。

ただし、これを実行できるライブラリがいくつかあります。

于 2009-04-24T21:06:38.833 に答える
2
public class A
{
   public void DoSomething();
}

public interface IDoSomething
{
   void DoSomething();
}

public class B : A, IDoSomething
{ }

B は A から継承することで IDoSomething.DoSomething を満たす

于 2009-04-24T20:54:58.050 に答える