¿Cómo implementas un setter privado cuando usas una interfaz?


139

He creado una interfaz con algunas propiedades.

Si la interfaz no existiera, todas las propiedades del objeto de clase se establecerían en

{ get; private set; }

Sin embargo, esto no está permitido cuando se usa una interfaz, entonces, ¿se puede lograr y, de ser así, cómo?

Respuestas:


266

En la interfaz puede definir solo getterpara su propiedad

interface IFoo
{
    string Name { get; }
}

Sin embargo, en su clase puede extenderlo para tener un private setter-

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

1
No parece quejarse si el configurador es público, incluso si la interfaz solo contiene un captador.
Mike Cheel el

66
@MikeCheel Eso es porque la interfaz solo define los métodos / accesores mínimos. Puede agregar más para cuando esté usando el objeto directamente. Sin embargo, cuando se utiliza un objeto como tipo de interfaz, solo se pueden usar los métodos / accesores definidos en la interfaz.
Marcello Nicoletti

29

La interfaz define API pública. Si la API pública contiene solo getter, usted define solo getter en la interfaz:

public interface IBar
{
    int Foo { get; }    
}

El configurador privado no forma parte de la API pública (como cualquier otro miembro privado), por lo que no puede definirlo en la interfaz. Pero puede agregar cualquier miembro (privado) a la implementación de la interfaz. En realidad, no importa si el setter se implementará como público o privado, o si habrá 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

Setter no es parte de la interfaz, por lo que no se puede llamar a través de su interfaz:

 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.