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?

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;
    }
}

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.