Come si implementa un setter privato quando si utilizza un'interfaccia?


139

Ho creato un'interfaccia con alcune proprietà.

Se l'interfaccia non esistesse, tutte le proprietà dell'oggetto classe verrebbero impostate su

{ get; private set; }

Tuttavia, ciò non è consentito quando si utilizza un'interfaccia, quindi è possibile ottenerlo e, in caso affermativo, come?

Risposte:


266

Nell'interfaccia puoi definire solo getterper la tua proprietà

interface IFoo
{
    string Name { get; }
}

Tuttavia, nella tua classe puoi estenderlo per avere un private setter-

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

1
Non sembra lamentarsi se il setter è pubblico, anche se l'interfaccia contiene solo un getter.
Mike Cheel,

6
@MikeCheel Ecco perché l'interfaccia definisce solo i metodi / gli accessori minimi. Sei libero di aggiungere altro per quando usi direttamente l'oggetto. Tuttavia, quando si utilizza un oggetto come tipo di interfaccia, sono utilizzabili solo quei metodi / accessori definiti nell'interfaccia.
Marcello Nicoletti,

29

L'interfaccia definisce l'API pubblica. Se l'API pubblica contiene solo getter, allora definisci solo getter nell'interfaccia:

public interface IBar
{
    int Foo { get; }    
}

Il setter privato non fa parte dell'API pubblica (come qualsiasi altro membro privato), quindi non è possibile definirlo nell'interfaccia. Ma sei libero di aggiungere membri (privati) all'interfaccia di implementazione. In realtà non importa se il setter sarà implementato come pubblico o privato, o se ci sarà 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

Il setter non fa parte dell'interfaccia, quindi non può essere chiamato tramite l'interfaccia:

 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.