web-dev-qa-db-ja.com

インターフェイスを使用する場合、プライベートセッターをどのように実装しますか?

いくつかのプロパティを持つインターフェイスを作成しました。

インターフェイスが存在しない場合、クラスオブジェクトのすべてのプロパティは

{ get; private set; }

ただし、これはインターフェイスを使用する場合は許可されないため、これを実現できますか?

121
dotnetnoob

インターフェイスでは、プロパティに対してgetterのみを定義できます

interface IFoo
{
    string Name { get; }
}

ただし、クラスでは、private setter-

class Foo : IFoo
{
    public string Name
    {
        get;
        private set;
    }
}
233
Rohit Vats

インターフェイスはパブリックAPIを定義します。パブリックAPIにゲッターのみが含まれている場合、インターフェイスでゲッターのみを定義します。

public interface IBar
{
    int Foo { get; }    
}

プライベートセッターは(他のプライベートメンバーのように)パブリックAPIの一部ではないため、インターフェイスで定義できません。ただし、インターフェイス実装に(プライベート)メンバーを自由に追加できます。実際には、セッターがパブリックとして実装されるかプライベートとして実装されるか、またはセッターが存在するかどうかは関係ありません。

 public int Foo { get; set; } // public

 public int Foo { get; private set; } // private

 public int Foo 
 {
    get { return _foo; } // no setter
 }

 public void Poop(); // this member also not part of interface

セッターはインターフェイスの一部ではないため、インターフェイス経由で呼び出すことはできません。

 IBar bar = new Bar();
 bar.Foo = 42; // will not work thus setter is not defined in interface
 bar.Poop(); // will not work thus Poop is not defined in interface
24