Интерфейс определяет публичный API. Если публичный API содержит только геттер, вы определяете только геттер в интерфейсе:
public interface IBar
{
int Foo { get; }
}
Частный сеттер не является частью общедоступного API (как и любой другой частный член), поэтому вы не можете определить его в интерфейсе. Но вы можете добавлять любые (частные) члены в реализацию интерфейса. На самом деле не имеет значения, будет ли сеттер реализован как публичный или частный, или будет ли сеттер:
public int Foo { get; set; }
public int Foo { get; private set; }
public int Foo
{
get { return _foo; }
}
public void Poop();
Сеттер не является частью интерфейса, поэтому его нельзя вызвать через ваш интерфейс:
IBar bar = new Bar();
bar.Foo = 42;
bar.Poop();