Jak zaimplementować setera prywatnego podczas korzystania z interfejsu?

139

Stworzyłem interfejs z kilkoma właściwościami.

Gdyby interfejs nie istniał, wszystkie właściwości obiektu klasy zostałyby ustawione na

{ get; private set; }

Jednak nie jest to dozwolone w przypadku korzystania z interfejsu, więc czy można to osiągnąć, a jeśli tak, to w jaki sposób?

dotnetnoob
źródło

Odpowiedzi:

266

W interfejsie możesz zdefiniować tylko getterdla swojej nieruchomości

interface IFoo
{
    string Name { get; }
}

Jednak w swojej klasie możesz ją przedłużyć, aby mieć private setter-

class Foo : IFoo
{
    public string Name
    {
        get;
        private set;
    }
}
Rohit Vats
źródło
1
Nie wydaje się narzekać, jeśli setter jest publiczny, nawet jeśli interfejs zawiera tylko getter.
Mike Cheel
6
@MikeCheel Thats, ponieważ interfejs definiuje tylko minimalne metody / akcesory. Możesz dodać więcej, gdy używasz obiektu bezpośrednio. Chociaż w przypadku używania obiektu jako typu interfejsu można używać tylko tych metod / metod dostępu zdefiniowanych w interfejsie.
Marcello Nicoletti
29

Interfejs definiuje publiczne API. Jeśli publiczne API zawiera tylko getter, to w interfejsie definiujemy tylko getter:

public interface IBar
{
    int Foo { get; }    
}

Ustawiacz prywatny nie jest częścią publicznego api (jak każdy inny prywatny członek), dlatego nie można go zdefiniować w interfejsie. Możesz jednak dodawać dowolnych (prywatnych) członków do implementacji interfejsu. Właściwie nie ma znaczenia, czy ustawiający zostanie zaimplementowany jako publiczny czy prywatny, czy też będzie ustawiający:

 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 nie jest częścią interfejsu, więc nie można go wywołać przez interfejs:

 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
źródło