Comment implémenter un setter privé lors de l'utilisation d'une interface?

139

J'ai créé une interface avec certaines propriétés.

Si l'interface n'existait pas, toutes les propriétés de l'objet de classe seraient définies sur

{ get; private set; }

Cependant, cela n'est pas autorisé lors de l'utilisation d'une interface, peut-on y parvenir et si oui, comment?

dotnetnoob
la source

Réponses:

266

Dans l'interface, vous ne pouvez définir que getterpour votre propriété

interface IFoo
{
    string Name { get; }
}

Cependant, dans votre classe, vous pouvez l'étendre pour avoir un private setter-

class Foo : IFoo
{
    public string Name
    {
        get;
        private set;
    }
}
Cuves Rohit
la source
1
Il ne semble pas non plus se plaindre si le setter est public même si l'interface ne contient qu'un getter.
Mike Cheel
6
@MikeCheel C'est parce que l'interface définit uniquement les méthodes / accesseurs minimum. Vous êtes libre d'en ajouter davantage lorsque vous utilisez l'objet directement. Cependant, lorsque vous utilisez un objet comme type d'interface, seules les méthodes / accesseurs définis dans l'interface sont utilisables.
Marcello Nicoletti
29

L'interface définit l'API publique. Si l'API publique ne contient que le getter, vous ne définissez que le getter dans l'interface:

public interface IBar
{
    int Foo { get; }    
}

Le setter privé ne fait pas partie de l'API publique (comme tout autre membre privé), vous ne pouvez donc pas le définir dans l'interface. Mais vous êtes libre d'ajouter des membres (privés) à l'implémentation de l'interface. En fait, peu importe si le setter sera implémenté comme public ou privé, ou s'il y aura 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 ne fait pas partie de l'interface, il ne peut donc pas être appelé via votre 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
Sergey Berezovskiy
la source