Wie implementieren Sie einen privaten Setter, wenn Sie eine Schnittstelle verwenden?

139

Ich habe eine Schnittstelle mit einigen Eigenschaften erstellt.

Wenn die Schnittstelle nicht vorhanden wäre, würden alle Eigenschaften des Klassenobjekts auf gesetzt

{ get; private set; }

Dies ist jedoch bei Verwendung einer Schnittstelle nicht zulässig. Kann dies erreicht werden und wenn ja, wie?

dotnetnoob
quelle

Antworten:

266

In der Schnittstelle können Sie nur getterfür Ihre Eigenschaft definieren

interface IFoo
{
    string Name { get; }
}

In Ihrer Klasse können Sie es jedoch erweitern, um ein private setter- zu haben

class Foo : IFoo
{
    public string Name
    {
        get;
        private set;
    }
}
Rohit Vats
quelle
1
Es scheint sich nicht zu beschweren, wenn der Setter öffentlich ist, auch wenn die Schnittstelle nur einen Getter enthält.
Mike Cheel
6
@MikeCheel Das liegt daran, dass die Schnittstelle nur die Mindestmethoden / Accessoren definiert. Sie können weitere hinzufügen, wenn Sie das Objekt direkt verwenden. Wenn Sie jedoch ein Objekt als Schnittstellentyp verwenden, können nur die in der Schnittstelle definierten Methoden / Accessoren verwendet werden.
Marcello Nicoletti
29

Schnittstelle definiert öffentliche API. Wenn die öffentliche API nur Getter enthält, definieren Sie nur Getter in der Schnittstelle:

public interface IBar
{
    int Foo { get; }    
}

Private Setter sind nicht Teil der öffentlichen API (wie jedes andere private Mitglied), daher können Sie sie nicht in der Schnittstelle definieren. Es steht Ihnen jedoch frei, (private) Mitglieder zur Schnittstellenimplementierung hinzuzufügen. Eigentlich spielt es keine Rolle, ob der Setter als öffentlich oder privat implementiert wird oder ob es einen Setter gibt:

 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

Setter ist nicht Teil der Schnittstelle, kann also nicht über Ihre Schnittstelle aufgerufen werden:

 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
Sergey Berezovskiy
quelle