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


139

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

インターフェイスが存在しない場合、クラスオブジェクトのすべてのプロパティは次のように設定されます。

{ get; private set; }

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

回答:


266

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

interface IFoo
{
    string Name { get; }
}

ただし、クラスで拡張してprivate setter-

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

1
インターフェースにgetterしか含まれていない場合でも、setterがpublicである場合でも不満はないようです。
Mike Cheel、2018年

6
@MikeCheelそれは、インターフェースが最小限のメソッド/アクセサのみを定義するためです。オブジェクトを直接使用している場合は、自由に追加できます。ただし、オブジェクトをインターフェイスタイプとして使用する場合は、インターフェイスで定義されているメソッド/アクセサのみを使用できます。
Marcello Nicoletti、2018

29

インターフェイスはパブリック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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.