0

最近、「Professional C#4 and.NET4」で次のように読みました。

インターフェイスをインスタンス化することはできません。

しかし、定期的に私はこのようなものを見ます:

IQuadrilateral myQuad;

(クラスがインターフェースから継承することなく)インターフェースを直接使用する場合の制限は何ですか?そのようなオブジェクトをどのように使用できますか(オブジェクトと呼ぶこともできる場合)?

たとえば、IQuadrilateralから派生したSquareクラスを使用する代わりに、IQuadrilateral myQuadのようなインターフェイスを作成することでどの程度回避できますか?

インターフェイスはメソッドを実装していないので、メソッドを使用することはできないと思います。インターフェイスにはフィールド(プロパティのみ)がないと思ったので、どのようにデータを保存できるかわかりません。

4

3 に答える 3

4

答えは簡単です。インターフェースをインスタンス化することはできません。

提供した例は、インターフェースをインスタンス化する例ではなく、タイプのローカル変数を定義しているだけです。IQuadrilateral

インターフェイスをインスタンス化するには、次のようにする必要があります。

IQuadrilateral myQuad = new IQuadrilateral();

IQuadrilateralコンストラクターがないため、これは不可能です。

これは完全に有効です:

IQuadrilateral myQuad = new Square();

ただし、開始するのではなく、開始IQuadrilateralSquareて、タイプが。の変数に割り当てますIQuadrilateral

で使用できるmyQuadメソッドは、インターフェイスで定義されたメソッドですが、実装はの実装に基づいていますSquare。また、変数にキャストしない限り、インターフェイスSquareの一部ではない追加のメソッドは使用できません。IQuadrilateralmyQuadSquare

于 2012-12-10T18:16:49.567 に答える
2

インターフェイスのインスタンスを作成することはできません。

示したコードは、タイプの変数を定義していますIQuadrilateral。この変数が指す実際のインスタンスは、常にこのインターフェイスを実装する具象クラスになります。

于 2012-12-10T18:13:53.040 に答える
0

背景知識

インターフェースを契約と考えてください。二人の間の契約では、それは何が可能であり、関係者から何が期待されるかを定義します。プログラミングでは、同じように機能します。インターフェースは、何を期待するか、そのインターフェースに準拠するために何が存在しなければならないかを定義します。したがって、それは何を期待するかを定義するだけなので、それ自体は実装を提供しません。いわば「裏のコード」は提供します。

プロパティはフィールドのように動作しますが、誰かがプロパティに値を割り当てたり、値を読み取ったりしたときにインターセプトすることができます。プロパティを定義するときに選択した、読み取りまたは書き込みを拒否することもできます。このため、インターフェイスはフィールドではなくプロパティで機能します。「コントラクト」は、存在するプロパティ(名前とタイプ)を定義するだけであり、読み取りまたは書き込み機能を許可する必要がある場合は、実装者に任せてこれを提供します。

たとえば、.NETFrameworkのIEnumeratorインターフェイスを取り上げます。このインターフェースは、オブジェクトのコレクションを反復処理できるように設計されています。目的は、アイテムを変更したり、ランダムにアクセスしたりすることではなく、オブジェクトAを取得して、次、次、次に必要な回数だけ移動することです。多くのコレクションタイプクラスがこれを実装します:Queue、ArrayList、SortedList、Stackなど。これらのタイプのオブジェクトはすべて多くのオブジェクトを格納し、今ではすべて共通の「コントラクト」を共有しています。

IEnumeratorただし、インターフェイスにMoveNext()メソッドが宣言されていることがわかります。なんで?これは、アイテムが同じ方法で提供されない場合があるためです。たとえば、人々は通常、最初の項目から最後の項目までArrayListにアクセスします。しかし、aStackは反対に設計されており、人々が最後のオブジェクトから最初のオブジェクトにアクセスできるようになっています。

回答された質問

このすべての知識があると、インターフェイスを実装したクラスタイプではなく、インターフェイスタイプとして変数を宣言することの制限は、インターフェイス(コントラクト)がそこにあるべきであると言うものにのみアクセスできることです。ただし、この変数には、インターフェイスを実装する任意のクラスタイプを割り当てることができるという利点があります。

于 2012-12-10T18:42:36.643 に答える