Как реализовать частный сеттер при использовании интерфейса?

Я создал интерфейс с некоторыми свойствами.

Если интерфейс не существует, все свойства объекта класса будут установлены на

{ get; private set; }

Однако, это не разрешено при использовании интерфейса, поэтому можно ли это сделать, и если да, то как?

Ответ 1

В интерфейсе вы можете определить только getter для вашего свойства

interface IFoo
{
    string Name { get; }
}

Однако в своем классе вы можете расширить его, чтобы иметь private setter -

class Foo : IFoo
{
    public string Name
    {
        get;
        private set;
    }
}

Ответ 2

Интерфейс определяет открытый API. Если public API содержит только getter, тогда вы определяете только getter в интерфейсе:

public interface IBar
{
    int Foo { get; }    
}

Частный сеттер не является частью публичного api (как и любой другой частный член), поэтому вы не можете определить его в интерфейсе. Но вы можете добавлять любых (частных) членов в реализацию интерфейса. На самом деле, не имеет значения, будет ли сеттер реализован как открытый или закрытый, или если будет сеттер:

 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

Сеттер не является частью интерфейса, поэтому его нельзя вызывать через ваш интерфейс:

 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