2009-03-08 8 views
16

Estoy buscando 'ampliar' una interfaz proporcionando acceso a las propiedades en esa interfaz. La interfaz se ve algo como esto:Agregue 'set' a las propiedades de la interfaz en C#

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

Quiero algo como esto:

interface IMutableUser : IUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

necesito el inheritence. No puedo copiar el cuerpo de IUser en IMutableUser y agregar los accesadores establecidos.

¿Es esto posible en C#? Si es así, ¿cómo se puede lograr?

Respuesta

12

No veo ninguna razón por lo que han publicado no debe trabajar? Acabo de hacer una prueba rápida y compila bien, pero da una advertencia sobre la ocultación. Esto se puede solucionar mediante la adición de la nueva palabra clave, así:

public interface IMutableUser : IUser 
{ 
    new string Username { get; set; } 
} 

Una alternativa sería añadir métodos conjunto explícito; por ejemplo:

public interface IMutableUser : IUser 
{ 
    void SetUsername(string value); 
} 

Por supuesto, yo prefiero usar los emisores, pero si no es posible, supongo que hacer lo que sea necesario.

+0

Agregar nuevo funcionó muy bien! ¡Gracias! ¿Puedes actualizar tu respuesta con un ejemplo (para otros)? – strager

+0

Desde el punto de vista práctico: las interfaces evolucionan muy mal a lo largo del tiempo. Todos los implementadores de la interfaz se romperán con cada cambio en este contrato ... –

+0

@PatrickPeters - ¿Supongo que el comentario fue dirigido al método SetUserName? No veo problemas con la primera opción. Algunos de los posibles cortes se eliminan si el implementador sigue la implementación explícita cuando corresponde. – Maslow

8

usted podría utilizar una clase abstracta:

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

abstract class MutableUser : IUser 
{ 
    public virtual string UserName 
    { 
     get; 
     set; 
    } 
} 

Otra posibilidad es tener esto:

interface IUser 
{ 
    string UserName 
    { 
     get; 
    } 
} 

interface IMutableUser 
{ 
    string UserName 
    { 
     get; 
     set; 
    } 
} 

class User : IUser, IMutableUser 
{ 
    public string UserName { get; set; } 
} 
+0

Necesito MutableUser para heredar IUser. Veré el primer método. – strager

+0

Usar una clase abstracta funciona. Sin embargo, no parece ser la solución más elegante aquí. Dejaremos esta pregunta abierta por un tiempo para posibles "mejores" respuestas. – strager

7

Puede "anular" las propiedades de una interfaz mediante la implementación explícita de las interfaces. Es probable que la respuesta de Chris sea todo lo que necesitará para el escenario que ha descrito, pero considere un escenario un poco más complejo, donde necesita un getter/setter en su clase, pero la interfaz solo define el getter. Puede evitar esto haciendo lo siguiente:

public class MyUser : IUser 
{ 

    IUser.MyProperty { get { return "something"; } } 

    public MyProperty { get; set; } 

} 

Mediante la implementación explícita IUser.MyProperty, usted cumple el contrato. Sin embargo, al proporcionar public MyProperty, la API para su objeto nunca mostrará la versión de interfaz explícita, y siempre usará MyProperty con el get/set.

Cuestiones relacionadas