web-dev-qa-db-fra.com

Comment implémentez-vous un poseur privé lorsque vous utilisez une interface?

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, ceci n'est pas autorisé lors de l'utilisation d'une interface. Cela peut donc être réalisé et si oui, comment?

121
dotnetnoob

Dans l'interface, vous ne pouvez définir que getter pour 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;
    }
}
233
Rohit Vats

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 poseur 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 n'importe quel membre (privé) à la mise en œuvre de l'interface. En réalité, peu importe si le setter sera implémenté en tant que public ou privé ou s'il y aura un 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
24
Sergey Berezovskiy