Як ви реалізуєте приватний сетер під час використання інтерфейсу?


139

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

Якщо інтерфейс не існував, були б встановлені всі властивості об'єкта класу

{ get; private set; }

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

Відповіді:


266

В інтерфейсі ви можете визначити лише getterсвою власність

interface IFoo
{
    string Name { get; }
}

Однак у своєму класі ви можете розширити його, щоб мати private setter-

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

1
Здається, не скаржиться, якщо сеттер загальнодоступний, навіть якщо інтерфейс містить лише геттер.
Майк Чіл

6
@MikeCheel Thats тому, що інтерфейс визначає лише мінімальні методи / доступ. Ви можете додати більше, коли ви безпосередньо використовуєте об'єкт. Хоча при використанні об'єкта як типу інтерфейсу можуть використовуватися лише ті методи / аксесуари, які визначені в інтерфейсі.
Марчелло Ніколетті

29

Інтерфейс визначає публічний API. Якщо публічний 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

Setter не є частиною інтерфейсу, тому його не можна викликати через ваш інтерфейс:

 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.