Como você implementa um setter privado ao usar uma interface?


139

Eu criei uma interface com algumas propriedades.

Se a interface não existisse, todas as propriedades do objeto de classe seriam definidas como

{ get; private set; }

No entanto, isso não é permitido ao usar uma interface; portanto, isso pode ser alcançado e, em caso afirmativo, como?

Respostas:


266

Na interface, você pode definir apenas getterpara sua propriedade

interface IFoo
{
    string Name { get; }
}

No entanto, em sua classe, você pode estendê-lo para ter um private setter-

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

1
Parece não reclamar se o setter é público, mesmo que a interface contenha apenas um getter.
Mike Cheel

6
@MikeCheel Isso ocorre porque a interface define apenas os métodos / acessadores mínimos. Você pode adicionar mais quando estiver usando o objeto diretamente. Embora ao usar um objeto como o tipo de interface, apenas os métodos / acessores definidos na interface sejam utilizáveis.
Marcello Nicoletti

29

Interface define API pública. Se a API pública contiver apenas getter, você definirá apenas getter na interface:

public interface IBar
{
    int Foo { get; }    
}

O setter privado não faz parte da API pública (como qualquer outro membro privado), portanto, você não pode defini-lo na interface. Mas você é livre para adicionar membros (privados) à interface de implementação. Na verdade, não importa se o setter será implementado como público ou privado ou se haverá 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

O setter não faz parte da interface, portanto, não pode ser chamado através da sua 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.