2008-10-20 8 views
10

Si j'ai une propriété à laquelle je souhaite laisser les héritiers écrire, mais qui reste en lecture seule, quelle est la meilleure façon de l'implémenter? Je vais généralement avec quelque chose comme ceci:Quelle est la meilleure façon d'implémenter une propriété qui est en lecture seule pour le public, mais accessible en écriture pour les héritiers?

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

Y at-il un meilleur moyen?

Répondre

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

ou en C# 3,0

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

Le champ 'protected' s'avérera supérieur si vous avez besoin d'utiliser des méthodes' Interlocked'. Je trouve étrange que C# expose des délégués d'événement avec le même nom que les événements, mais n'expose pas du tout les variables de sauvegarde de propriété automatique. – supercat

0

Avoir un setter et getter est pas vraiment mieux que d'avoir une variable à ce niveau de visibilité.

Par conséquent, vous pouvez simplement rendre la variable elle-même protégée et le lecteur public. Cela dit, les setters et les getters sont un indicateur de mauvais OO - êtes-vous sûr de les avoir besoin? Vous devriez demander à l'objet de faire quelque chose avec ses membres, ne pas le demander à ses membres puis les manipuler en dehors de l'objet.

C'est une règle très générale et il y a beaucoup d'exceptions.

+2

Non-sens; un getter/setter est * significativement * meilleur qu'un champ protégé. Les getters/setters ne sont * pas * un indicateur de mauvais OO: ils montrent l'encapsulation et permettent le polymorphisme (via virtual) - comment OO voulez-vous? –

+0

Ils exposent toujours l'implémentation de votre classe et indiquent que vous récupérez des données au lieu de demander à une classe de réaliser une opération pour vous. Ce n'est pas OO, c'est faux-oo que les programmeurs procéduraux utilisent avant qu'ils obtiennent réellement OO. –

+0

Voici un bon article à ce sujet si vous êtes intéressé: http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html –

5

C'est définitivement la voie à suivre.

public object MyProp {get; protected set;} 

Si vous utilisez une ancienne version de C#, alors c'est le chemin à parcourir.

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

Et si vous êtes sur une très ancienne version de C#, vous devez avoir un séparé Méthode de jeu protégée :( –