C#がインターフェイスのプロパティを許可するのはなぜですか?


47

C#では、次のコードが有効です

interface I{
    int property{get;set;}
}

これは私には意味がありません。これは、インターフェースの最も重要な原則の1つ、つまり状態の欠如(つまり、フィールドなし)を破っているようです。プロパティは暗黙のプライベートフィールドを作成しませんか?それはインターフェースにとって本当に悪いことではないでしょうか?


12
状態の欠如は、インターフェイス実装の原則の1つですか?私にとって、インターフェイスはコントラクトを定義する方法です。つまり、クラスがそのようなインターフェイスを実装する場合、コントラクトで定義されたすべてのメソッドとプロパティを持ちます。
フロリアンマーゲイン14

4
プロパティは、単なるgetメソッドとsetメソッドです。インターフェースは実装する必要のあるメソッドのリストにすぎないため、インターフェースがそれらを保持できるのは当然です。
ドーバル14

1
@FlorianMargaine確かに、契約の概念はインターフェイスの最も重要な原則ですが、状態の欠如も重要です。これにより、抽象クラスから分離できます。IE 8のJava 8は、インターフェースと抽象クラスの唯一の大きな違いになります。
モニカの


2
@Doval:インターフェースがそのようなメソッドを宣言するのは当然ですが、それらを実装するのではありません。
ジョルジオ14

回答:


65

紛らわしい部分はint Property { get; set; }、クラス内に記述した場合、暗黙のバッキングフィールドを持つ自動プロパティだということです。

ただし、インターフェイスにまったく同じことを記述した場合、それはauto-propertyではなく、プロパティがインターフェイスの一部であり、インターフェイスを実装するすべての型がそのプロパティを含む必要があることを宣言するだけです(auto-propertyまたは)、ただし、バッキングフィールドは作成されません。

違いを確認する1つの方法は、次のように記述することint Property { get; }です。これはインターフェイスで有効であり、ゲッターのみを持ちセッターを持たないプロパティを宣言します。ただし、自動プロパティにはセッターが必要なため、クラスでコンパイルされません(C#6.0を使用している場合を除く)。


18

示したようにプロパティを定義することは、メソッドint GetProperty()とを定義することと同じvoid SetProperty(int i)です。プロパティはC#の強力な略記です。

プロパティは、C#でプライベートフィールドを暗黙的に作成しません。auto-propertyたとえば、これはのデフォルトの実装ですpublic string MyString { get; set;}-ただし、getメソッドのカスタムロジックを定義するプロパティは、暗黙的なプライベートフィールドを生成しません。

最後に、インターフェイスはパブリック APIに関係しているので、インターフェイスプロパティの実装がプライベートフィールドに依存している場合、それが暗黙的であるかそうでないかは重要ですか?それは、インターフェースのコンシューマーには関係なく隠されています。


ああ...私はそれが自動プロパティでのみ起こることを理解していませんでした、そしてあなたはそれをオーバーライドする必要があるので、それは理にかなっています。しかし、インターフェースが内部プライベート変数を作成する場合、実装者はそれにアクセスできません-明らかな問題。
モニカの

9
C#インターフェイスでプロパティを定義する場合、そのプロパティの実装は実装クラスに委ねられます。自動プロパティにするか、適切と思われるカスタムロジックを定義できます。インターフェースにフィールドは追加されません。
NWard

10

プロパティメソッドです!インターフェースを実装するクラスにバッキングフィールドが追加されます(手動または自動プロパティを使用)。


バッキングフィールドがない場合もあります。ただし、getとsetの両方を定義し、そのためのバッキングフィールドがないことはまれです。
スティーブン14

+1 プロパティはメソッドです! はい!私はPropertymethodsを書くのが好きですが、コードレビューの同僚はそのように見ていませんし、私たちのプログラムで素晴らしい表現力豊かなカプセル化の機会を本当に逃しています。
レーダーボブ14

ただし、これらの「プロパティメソッド」は、DBルックアップなどを行わないように迅速に処理する必要があります。プロパティへのアクセスは高速で、Get *メソッドは低速になる可能性があるという暗黙の契約があります。
トレイマック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.