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


142

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

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

{ get; private set; }

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

Ответы:


274

В интерфейсе вы можете определить только getterсвою собственность

interface IFoo
{
    string Name { get; }
}

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

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

1
Кажется, он не жалуется, если сеттер является общедоступным, даже если интерфейс содержит только геттер.
Майк Чил

6
@MikeCheel Это потому, что интерфейс определяет только минимальный набор методов / средств доступа. Вы можете добавить больше, если используете объект напрямую. Хотя при использовании объекта в качестве типа интерфейса можно использовать только те методы / средства доступа, которые определены в интерфейсе.
Марчелло Николетти

28

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

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.