2008-10-20 5 views
10

Si tengo una propiedad en la que quiero permitir que los herederos escriban, pero sigo solo de forma externa, ¿cuál es la forma preferida de implementar esto? Normalmente voy con algo como esto:¿Cuál es la mejor manera de implementar una propiedad que es de solo lectura para el público, pero que se puede escribir en los herederos?

private object m_myProp; 
public object MyProp 
{ 
    get { return m_myProp; } 
} 
protected void SetMyProp(object value) 
{ 
    m_myProp = value; 
} 

¿Hay una manera mejor?

Respuesta

36
private object m_myProp; 
public object MyProp 
{ 
    get { return m_myProp; } 
    protected set { m_myProp = value; } 
} 

O en C# 3,0

public object MyProp {get; protected set;} 
+0

El campo 'protected' resultará ser superior si alguna vez existe la necesidad de utilizar cualquier método' Interlocked' en él. Me parece extraño que C# expone delegados de eventos con el mismo nombre que los eventos, pero no expone las variables de respaldo de auto-propiedad en absoluto. – supercat

0

Tener un setter y getter no es realmente mejor que tener una variable en ese nivel de visibilidad.

Por lo tanto, puede hacer que la variable esté protegida y el lector sea público.

Dicho esto, setters y getters son un indicador de mal OO - ¿estás seguro de que los necesitas? Debería pedirle al objeto que haga algo con sus miembros, no pedirle sus miembros y luego manipularlos fuera del objeto.

Esta es una regla muy general y hay muchas excepciones.

+2

Tonterías; un getter/setter es * significativamente * mejor que un campo protegido. Los getters/setters son * no * un indicador de mal OO: exhiben encapsulación y permiten el polimorfismo (a través de virtual) - ¿cómo OO quieres? –

+0

Aún exponen la implementación de su clase, y son una indicación de que está obteniendo datos en lugar de pedirle a una clase que realice una operación por usted. Eso no es OO, es falso que los programadores de procedimientos usan antes de obtener OO. –

+0

Aquí hay un buen artículo al respecto si está interesado: http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html –

5

Este es definitivamente el camino a seguir.

public object MyProp {get; protected set;} 

Si tiene una versión anterior de C#, este es el camino a seguir.

private object _myProp; 
public object MyProp 
{ 
    get { return _myProp; } 
    protected set { _myProp = value; } 
} 
+4

Y si está en una versión muy antigua de C#, debe tener un archivo separado método de configuración protegida :( –

Cuestiones relacionadas