2010-03-21 24 views
21

Las interfaces, tal como se definen en MSDN "contienen solo las firmas de métodos, delegados o eventos". Sin embargo, dado que las propiedades no son más que azúcar sintáctica para un método get y set, también están permitidas en las interfaces. Mi pregunta es: ¿hay alguna situación en la que sea apropiado definir propiedades en una interfaz o deberíamos seguir los escenarios descritos por MSDN?¿Deben las interfaces definir propiedades?

Respuesta

31

Creo que las propiedades son perfectamente aceptables en las interfaces.

Como dijiste, realmente son un método get, set o get and set. Muchas interfaces en el Framework definen propiedades, como IAsyncResult y IWebProxy.

+0

Gracias, Reed. En este caso, ¿estas propiedades deberían ser de tipos elementales (no definidos por el usuario)? La razón por la que pregunto es porque si, por ejemplo, lo define como un tipo de dominio, puede terminar con una referencia circular. –

+1

@ Otávio Décio: tenga en cuenta el propósito de una interfaz. Una interfaz define un contrato. Si se requiere una propiedad para el contrato, está bien. No debe terminar con referencias circulares, ya que las propiedades no deben ser tipos que están implementando directamente la interfaz, sino básicos, tipos de marcos o tipos que, a su vez, forman parte del "contrato". IWebProxy (vinculado arriba) es un buen ejemplo: tiene una propiedad Credentials, que es de ICredentials. Eso es parte del contrato, pero es esencial un tipo "definido por el usuario" aún (para esa lib). –

+1

solo para asegurarse: las propiedades definidas en las interfaces deben ser tipos de concreto definidos por el usuario o tipos de interfaz (definidos por el usuario o no). –

13

El artículo que vincula a los Estados también:

Una interfaz puede ser un miembro de un espacio de nombres o una clase y pueden contener firmas de los siguientes miembros:

  • Métodos
  • Propiedades
  • indexadores
  • Eventos
+0

@Simon: sí, ya veo. –

3

Sí, una interfaz debe definir las propiedades cuando realmente lo necesitan. Por favor, supongo que. Hay una interfaz IUser que ha definido una propiedad "Nombre" y luego puede usarla sin preocuparse si el objeto no implementó la propiedad.

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