L'interface définit l'API publique. Si l'API publique ne contient que des getter, alors vous ne définissez que des getter dans l'interface :
public interface IBar
{
int Foo { get; }
}
Le setter privé ne fait pas partie de l'API publique (comme tout autre membre privé), donc vous ne pouvez pas le définir dans l'interface. Mais vous êtes libre d'ajouter n'importe quel membre (privé) à l'implémentation de l'interface. En fait, il n'est pas important de savoir si le setter sera implémenté comme public ou privé, ou s'il y aura un setter :
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 ne fait pas partie de l'interface, il ne peut donc pas être appelé via votre 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