Perché C # consente le proprietà nelle interfacce?


47

In C #, il seguente codice è valido

interface I{
    int property{get;set;}
}

Il che non ha alcun senso per me. Questo sembra infrangere uno dei principi più importanti delle interfacce: mancanza di stato (in altre parole, nessun campo). La proprietà non crea un campo privato implicito? Non sarebbe davvero male per le interfacce?


12
La mancanza di stato è uno dei principi di un'implementazione dell'interfaccia ? Per me, un'interfaccia è un modo per definire un contratto, cioè se una classe implementa tale interfaccia, allora ha tutti i metodi e le proprietà definite nel contratto.
Florian Margaine,

4
Una proprietà è solo un metodo get e un metodo set. Poiché le interfacce sono solo un elenco di metodi che devi implementare, è naturale che le interfacce possano averle.
Doval,

1
@FlorianMargaine Certamente il concetto di contratto è il principio più importante delle interfacce, ma anche la mancanza di stato è importante. Questo aiuta a tenerlo separato da una classe astratta. IE in Java 8 finisce per essere l'unica grande differenza tra interfacce e classi astratte.
Ripristina Monica il


2
@Doval: è naturale che un'interfaccia dichiari tali metodi, ma non che li implementi.
Giorgio,

Risposte:


65

Penso che la parte confusa sia che se scrivi int Property { get; set; }all'interno di una classe, allora è una proprietà automatica con campo di supporto implicito.

Ma se scrivi esattamente la stessa cosa in un'interfaccia, allora non è auto-proprietà , dichiara semplicemente che la proprietà fa parte dell'interfaccia e che qualsiasi tipo che implementa l'interfaccia deve contenere quella proprietà (come auto-proprietà o no ), ma non crea il campo di supporto.

Un modo per vedere la differenza è scrivere int Property { get; }: questo è valido in un'interfaccia e dichiara una proprietà che ha solo un getter, ma nessun setter. Ma non verrà compilato in una classe (a meno che tu non stia usando C # 6.0), poiché la proprietà automatica deve avere un setter.


18

Definire la proprietà come mostrato è uguale ai metodi di definizione int GetProperty()e void SetProperty(int i). Le proprietà sono potenti abbreviazioni in C #.

Una proprietà non crea implicitamente un campo privato in C #. Questa è l'implementazione predefinita di un auto-property, ad esempio public string MyString { get; set;}, tuttavia, una proprietà che definisce la logica personalizzata nel getmetodo non genera un campo privato implicito.

Infine, poiché le interfacce riguardano l' API pubblica , che importanza avrebbe se l'implementazione di una proprietà di interfaccia si basasse su un campo privato - implicito o no? Ciò è nascosto ai consumatori dell'interfaccia a prescindere.


Ahh ... Non mi rendevo conto che succede solo per le proprietà automatiche, e dal momento che devi scavalcarlo, ha senso. Ma se l'interfaccia dovesse creare una variabile privata interna, gli implementatori non avrebbero accesso ad essa - un problema evidente.
Ripristina Monica il

9
Se si definisce una proprietà in un'interfaccia C #, l'implementazione di quella proprietà viene lasciata alla classe di implementazione: possono renderla una proprietà automatica o definire la logica personalizzata come meglio ritiene. Nessun campo viene aggiunto all'interfaccia .
NWard,

10

Le proprietà sono metodi! Un campo di supporto verrà aggiunto alla classe che implementa l'interfaccia (manualmente o tramite una proprietà automatica).


A volte non ci sarà campo di appoggio. Anche se sarebbe raro definire sia un get che un set e non avere un campo di supporto per questo.
Stephen,

Le proprietà +1 sono metodi! sì! Mi piace scrivere i metodi di proprietà, ma i colleghi che esaminano il codice non la vedono in questo modo e ci mancano davvero delle opportunità per alcuni incapsulamenti espressivi piacevoli nei nostri programmi.
radarbob,

Quei "metodi di proprietà" dovrebbero essere veloci, come nessuna ricerca di DB o altro. C'è un contratto implicito che l'accesso alla proprietà è veloce, i metodi Get * possono essere lenti.
Trey Mack,
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.