web-dev-qa-db-ja.com

C#のgetterおよびsetterとのインターフェース

ここで読んだように http://msdn.Microsoft.com/en-us/library/75e8y5dd%28v=VS.100%29.aspx

インターフェイスにgetを含めることは可能ですが、setはできませんか?

または、インターフェイスでゲッターとセッターが必要な場合、新しい構文がインターフェイス構文に適合しないという理由だけで、古い構文getVarsetVarを使用する必要がありますか?

更新:インターフェイスでsetを省略しなければならない場合、これは、部分的にしか適用できないため、この場合、インターフェイスを持つ目的を無効にするセッターを持つようにクラスを強制できないことを意味しますか?

16
user310291

いいえ、あなたは誤解していると思います。その記事は、読み取り専用プロパティ(ゲッターのみを持つプロパティ)を持つインターフェイスを持つことの可能性についてです。ただし、必要に応じて、インターフェイスにセッターを配置することもできます。

interface IHasProperty
{
    string Property{ get;set; }
}
class HasProperty:IHasProperty 
{
    public string Property{ get;set; }
}
39
Andrea Parodi

プロパティ構文を使用できます。この組み合わせを使用します。

interface ISomething
{
    string Test { get; }
}

class Something : ISomething
{
    public string Test { get; private set; }
}

もちろん、必要に応じて、Something.Testでゲッターの完全な実装を追加できます。簡潔にするために、バッキングフィールドのみを使用しました。

インターフェイスは、実装する必要のある最小限のセットを定義することを忘れないでください。必要な上に任意の肉汁(新しいメソッド、アクセサー、メンバーなど)を追加できます。パブリックセッターを追加することもできます。

interface ISomething
{
    string Test { get; }
}

class Something : ISomething
{
    public string Test { get; set; } // Note that set is public
}

唯一の制限は、具体的なタイプ(インターフェイスではなくクラス)の参照、または追加したメソッドを定義する別のインターフェイスがない限り、追加したグレイビーを誰かが使用できないことです。

13

はい、プロパティ宣言からset;を省略してください。例えば:

interface IName
{
    string Name { get; }
}
8
Nathan Ernst

実際の答えは、上記の答えの組み合わせです。インターフェイスでsetterを省略し、get; private set;クラスで。

7
Aliostad

入手可能にするだけの場合は、{get;private set;}を使用してください

http://msdn.Microsoft.com/en-us/library/bb384054.aspx

前の例に示されているクラスは変更可能です。クライアントコードは、オブジェクトの作成後にオブジェクトの値を変更できます。重要な動作(メソッド)とデータを含む複雑なクラスでは、多くの場合、パブリックプロパティが必要になります。ただし、値(データ)のセットをカプセル化するだけで動作がほとんどまたはまったくない小さなクラスまたは構造体の場合は、セットアクセサーをプライベートとして宣言して、オブジェクトを不変にすることをお勧めします。詳細については、「方法:自動実装プロパティを使用して軽量クラスを実装する(C#プログラミングガイド)」を参照してください。

属性は自動実装されたプロパティで許可されますが、ソースコードからアクセスできないため、バッキングフィールドでは許可されません。プロパティのバッキングフィールドで属性を使用する必要がある場合は、通常のプロパティを作成するだけです。

4
Gage

あなたは誤解しました。記事によると、インターフェースでアクセス修飾子を使用することはできません。

インターフェイスプロパティでgetとsetの両方を使用できます!

次のMSDNの例を参照してください。

http://msdn.Microsoft.com/en-us/library/87d83y5b(v = VS.100).aspx

2
Tor