usar una que público puede propiedades programacion porque multiple miembro interfaz interfaces implementar implementacion herencia definicion declaracion c# inheritance interface

una - propiedades en interfaces c#



Añadir ''set'' a las propiedades de la interfaz en C# (3)

Estoy buscando ''extender'' una interfaz al proporcionar accesores establecidos a las propiedades en esa interfaz. La interfaz se ve algo como esto:

interface IUser { string UserName { get; } }

Quiero algo como esto:

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

Necesito la herencia. No puedo copiar el cuerpo de IUser en IMutableUser y agregar los IMutableUser establecidos.

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


No veo ninguna razón por la que lo que has publicado no debería funcionar. Acabo de hacer una prueba rápida y compila bien, pero da una advertencia sobre la ocultación. Esto se puede arreglar agregando la nueva palabra clave, como esta:

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

Una alternativa sería agregar métodos de conjuntos explícitos; p.ej:

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

Por supuesto, prefiero usar setters, pero si no es posible, creo que haces lo que tienes que hacer.


Podrías usar 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; } }


Puede "anular" las propiedades en una interfaz implementando explícitamente las interfaces. La respuesta de Chris es probablemente 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 al getter. Puedes solucionar esto haciendo lo siguiente:

public class MyUser : IUser { IUser.MyProperty { get { return "something"; } } public MyProperty { get; set; } }

Al implementar explícitamente IUser.MyProperty , usted IUser.MyProperty el contrato. Sin embargo, al proporcionar MyProperty pública, la API para su objeto nunca mostrará la versión de la interfaz explícita, y siempre usará MyProperty con el comando get / set.