C# では、クラスに Interface のすべての正しいメソッド/シグネチャがあるが、次のように明示的に実装されていない場合:
class foo : IDoo {}
クラスをそのインターフェイスとしてキャストできますか?
C# では、クラスに Interface のすべての正しいメソッド/シグネチャがあるが、次のように明示的に実装されていない場合:
class foo : IDoo {}
クラスをそのインターフェイスとしてキャストできますか?
ダックタイピング
あなたがほのめかしているのは、「ダックタイピング」と呼ばれます(「アヒルのように見え、アヒルのように鳴く場合、アヒルに違いない」というイディオムにちなんで名付けられました)。
ダックタイピングでは、(説明したように) 関連するメンバーを実装すると、インターフェイスの実装は暗黙的になりますが、.NET では現在、これに対する幅広いサポートがありません。
将来に向けて計画されている新たな動的言語機能を考えると、これが近い将来にランタイムによってネイティブにサポートされたとしても、私は驚かないでしょう。
それまでの間、リフレクションを介してダックタイピングを統合できます。このようなライブラリを使用すると、次のようなダックタイプのキャストを実行できます。IDoo myDoo = DuckTyping.Cast<IDoo>(myFoo)
トリビア
興味深いことに、今日の C# でダックタイピングが使用されている小さな場所が 1 つあります。それはforeach
演算子です。Krzysztof Cwalinaはforeach
、クラスが演算子によって列挙可能であるためには、次のことを行う必要があると述べています。
パラメーターをとらず、2 つのメンバーを持つ型を返すパブリック メソッド GetEnumerator を提供します。a) パラメーターをとらず、ブール値を返すメソッド MoveMext、および b) オブジェクトを返すゲッターを持つプロパティ Current。
IEnumerable
彼がnorについて言及していないことに注意してくださいIEnumerator
。列挙可能なクラスを作成するときにこれらのインターフェイスを実装するのが一般的ですが、インターフェイスを削除して実装を残した場合でも、クラスはforeach
. 出来上がり!ダックタイピング!(サンプルコードはこちら。)
いいえ、Objective-C やその他の言語とは異なります。インターフェイスの実装を明示的に宣言する必要があります。
IDoo に何らかのメンバーがある場合、このコードはコンパイルされません。IDoo にメンバーが存在しない場合、はい、キャストは安全です (ただし、使用は明らかに制限されています)。
これには基本的に、C# でダック タイピングが機能する必要がありますが、これは自動的には行われません。
ただし、これを実行できるライブラリがいくつかあります。
public class A
{
public void DoSomething();
}
public interface IDoSomething
{
void DoSomething();
}
public class B : A, IDoSomething
{ }
B は A から継承することで IDoSomething.DoSomething を満たす