Pregunta

¿Se recomienda establecer las variables miembro de una clase base como protegidas, para que las subclases puedan acceder a estas variables?¿O es más recomendable establecer las variables miembro como privadas y dejar que las subclases obtengan o establezcan la variable mediante captadores y definidores?

Y si se recomienda utilizar el método getters y setters, ¿cuándo se utilizan las variables protegidas?

¿Fue útil?

Solución

Esto es muy similares esta pregunta , sobre si se debe acceder a la información dentro de la misma clase a través propiedades o acceso directo. Es probable que vale la pena leer todas esas respuestas también.

En lo personal, no me gustan los campos a ser no-privada con la excepción ocasional de campos de sólo lectura estática con los valores inmutables (si o no) const. Para mí, las propiedades se dan por un mejor grado de encapsulación. Cómo los datos se almacena es un aplicación decisión, no un API decisión (a diferencia de propiedades). ¿Por qué la clase Foo derivados de la atención acerca de la clase de barra de aplicación de la clase Bar?

En resumen, siempre iría a propiedades, y yo no uso las variables protegidas para otra cosa que el código de prueba de usar y tirar.

Con propiedades implementadas automáticamente en C # 3.0, es más fácil que nunca para convertir los campos en propiedades. Hay muy poco razón no para hacerlo.

Otros consejos

Las clases en otros conjuntos pueden derivar de sus clases no sellados y pueden acceder a los campos protegidos. Si algún día decide hacer esos campos en propiedades, esas clases en otras asambleas tendrán que volver a compilar para trabajar con la nueva versión de su montaje. Eso se llama "la compatibilidad binaria de ruptura", y es quizás la razón de peso por la cual no debe nunca exponer a campos fuera de una asamblea.

Estoy de acuerdo con Jon.

Sin embargo, utilizo la variable protegida para "top más" clase de herencia en algún momento de alguna condición. Ejemplo, si tiene un objeto que es de sólo lectura y no se puede establecer de nuevo, pero eso se puede usar en una clase de niños, no veo por qué debería tener un GET protegido para tener acceso a esa variable. Una variable protegida sencillo hacer lo mismo encapsulado porque no se puede establecer esta variable y se puede acceder a esta variable sólo de la clase hija.

Pero set / get es la manera de hacerlo de otra situación.

Esta es una compensación aquí.Los definidores y captadores son algo más lentos que acceder a los campos directamente, por lo que si está haciendo muchos cálculos matemáticos y lee/escribe mucho estos campos en sus subclases, debe optar por acceder a los campos directamente.Pero esto es más bien una excepción.

Normalmente, deberías marcarlos como privados y optar por captadores/definidores.

Entonces mi respuesta es:acceso directo para campos muy utilizados, captadores/definidores en caso contrario.Usa el sentido común.

EDITAR:Hice algunos perfiles y aparentemente incluso en el modo Lanzamiento, puede haber una diferencia de velocidad de hasta el 20% entre campos y propiedades. Vea mi caso de prueba aquí: http://pastebin.com/m5a4d1597

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top