2010-03-21 17 views
21

Le interfacce, come definito da MSDN "contengono solo le firme di metodi, delegati o eventi." Tuttavia, poiché le proprietà non sono altro che zucchero sintattico per un metodo get e set, sono ammesse anche nelle interfacce. La mia domanda è: c'è qualche situazione in cui la definizione delle proprietà in un'interfaccia è appropriata o dovremmo attenerci agli scenari descritti da MSDN?Le interfacce devono definire le proprietà?

risposta

31

Penso che le proprietà siano perfettamente accettabili nelle interfacce.

Come hai detto, sono davvero un metodo get, set o get e set. Molte interfacce nel Framework definiscono proprietà, come IAsyncResult e IWebProxy.

+0

Grazie, Reed. In questo caso, queste proprietà dovrebbero essere di tipi elementari (non definiti dall'utente)? Il motivo per cui lo chiedo è perché se per esempio lo definisci come un tipo di dominio, potresti finire con un riferimento circolare. –

+1

@ Otávio Décio: Tieni presente lo scopo di un'interfaccia. Un'interfaccia definisce un contratto. Se una proprietà è richiesta per il contratto, allora va bene. Non dovresti finire con riferimenti circolari, dal momento che le proprietà non dovrebbero essere tipi che implementano direttamente l'interfaccia, ma piuttosto i tipi di base, i tipi di framework oi tipi che, loro stessi, fanno parte del "contratto". IWebProxy (collegato sopra) è un buon esempio: ha una proprietà Credentials, che è di ICredentials. Questo è parte del contratto, ma è essenziale un tipo "definito dall'utente" ancora (per quella lib). –

+1

solo per essere sicuri - le proprietà definite nelle interfacce dovrebbero essere tipi concreti non definiti dall'utente o tipi di interfaccia (definiti dall'utente o meno). –

13

L'articolo si collega a afferma anche:

Un'interfaccia può essere un membro di un namespace o di una classe e possono contenere firme dei seguenti membri:

  • Metodi
  • Proprietà
  • Indicatori
  • Eventi
+0

@Simon: sì, ora vedo. –

3

Sì, Un'interfaccia dovrebbe definire le proprietà quando veramente bisogno. Supponiamo che C'è un'interfaccia IUser che ha definito una proprietà "Nome", quindi puoi usarla senza preoccuparti se l'oggetto non ha implementato la proprietà.

public void main() 
{ 
    IUser u = User.GetUser("id"); 
    string name = u.Name; 
} 
Problemi correlati