2011-12-15 19 views
32

¿Alguien podría ayudarme si es una buena práctica incluir propiedades en Interface o Abstract Class?Propiedades de C# en la interfaz

Me imagino que una interfaz solo debería tener firmas de métodos?

+0

posible duplicado de [Interfaz vs clase abstracta (OO general)] (http://stackoverflow.com/questions/761194/interface-vs-abstract-class-general-oo) – MPelletier

+2

¿cómo es eso un engaño? Como Kyle señaló a continuación, ambas interfaces y clases abstractas pueden tener propiedades, por lo que no hay un "vs." aquí. – bryanmac

Respuesta

11

Propiedades están bien en una interfaz

Ver:

http://msdn.microsoft.com/en-us/library/ms173156.aspx

Interfaces consisten en métodos, propiedades, eventos, indizadores, o cualquier combinación de estos cuatro tipos de miembro. Una interfaz no puede contener constantes, campos, operadores, constructores de instancias, destructores o tipos . No puede contener miembros estáticos. Los miembros de las interfaces son automáticamente públicos, y no pueden incluir ningún modificador de acceso.

+20

El hecho de que sea posible no significa que sea una buena práctica como pidió OP. –

12

Es perfectamente aceptable tener propiedades en una interfaz. Lo hago todo el tiempo.

+0

Quizás sea solo una cuestión de preferencia. Bueno, voy a olvidar estos debates y hacer lo que haces. – SWIIWII

6

Es perfectamente válido incluir una propiedad en una interfaz o clase abstracta.

25

Las propiedades son azúcar sintáctico para los métodos. Considere esto:

tengo una propiedad:

String PropertyA { get; set; } 

En tiempo de ejecución esto se convierte en algo parecido a esto:

String get_PropertyA() { ... } 
void set_PropertyA(String value) { ... } 

Tenga en cuenta que el "..." indica el código que haría ser puesto allí por el generador de código. Efectivamente, lo que estoy diciendo es que las propiedades realmente no existen más allá de C#, ya que compilan a los métodos que usan una convección indicada en mi ejemplo. Para confirmar lo que estoy diciendo, puedes usar el reflejo y echar un vistazo a cómo se ve el código reflejado.

Sin embargo, puede ser una mala práctica poner propiedades en una interfaz si hacen algo que no sea trivial en la implementación. Por ejemplo, si quiero establecer una variable y eso actualiza otras variables, o establecer una propiedad puede denegar la asignación de mi propiedad debido a una condición interna, entonces no se debe usar una propiedad. Creo que es una regla general que se aplicaría más allá de las interfaces.

+2

Hacer algo no trivial es una mala práctica para el período de propiedades como usted señaló.Causa problemas en el depurador y no está claro para el consumidor de la clase que se realizará un trabajo significativo. Para las interfaces, no puede determinar si es no trivial ya que no tiene una implementación. Todo lo que puede hacer es implicar un trabajo no trivial por el nombre, pero por definición funciona. naturalmente implica un método. – bryanmac

+1

El uso exclusivo de propiedades getter tiene mucho sentido para las interfaces DTO. – mbx

+0

¿Cómo definimos no trivial? He estado luchando con la decisión de hacer algunos miembros en mis propiedades o métodos de interfaz. En una implementación, será un set/get directo de un campo, pero en otro, deberá realizar una expresión regular para extraer el valor del miembro de un campo. ¿Cómo podemos saber si no será trivial si aún no conocemos las diversas implementaciones de la interfaz? –

1

No creo que haya una mejor práctica para esto.

Las propiedades (que realmente son métodos) están permitidas en las interfaces. Algo más que esto es solo una opinión. Esto incluye mi punto sobre cualquier cosa más que sea una opinión.