Question

est-il recommandé de définir des variables membres d'une classe de base pour la protection, de sorte que les sous-classes peuvent accéder à ces variables? Ou est-il plus recommandé de définir les variables membres à laisser privé et les sous-classes ou définit le varible par des accesseurs?

Et s'il est recommandé d'utiliser la méthode des accesseurs, quand les variables sont protégées utilisées?

Était-ce utile?

La solution

Ceci est très similaire cette question, sur l'opportunité d'accéder à des informations dans la même classe via propriétés ou accès direct. Il est probablement utile de lire toutes ces réponses aussi.

Personnellement, je n'aime pas les champs à être non-privé, à l'exception occasionnelle de champs statiques avec des valeurs en lecture seule immuables (si const ou non). Pour moi, les propriétés donnent juste un meilleur degré d'encapsulation. Comment les données sont stockées est une décision, pas une décision API la mise en œuvre (contrairement à propriétés). Pourquoi la classe Foo provenant de soins classe Bar sur le la mise en œuvre Bar classe?

En bref, je vais toujours les biens immobiliers, et je ne pas utiliser des variables protégées pour autre chose que le code de test jetable.

Avec des propriétés mises en œuvre automatiquement en C # 3.0, il est plus facile que jamais de transformer les champs en propriétés. Il y a peu de raisons précieux pas pour le faire.

Autres conseils

Les classes dans d'autres assemblées peuvent dériver de vos classes non scellées et peuvent accéder aux champs protégés. Si un jour vous décidez de faire ces champs dans les propriétés, ces classes dans d'autres assemblées devront être recompilés pour travailler avec la nouvelle version de votre assemblée. On appelle cela la « compatibilité binaire de rupture », et est peut-être une bonne raison pour laquelle vous ne devriez jamais exposer les champs en dehors d'un ensemble.

Je suis d'accord avec Jon.

Mais, j'utilise la variable protégée pour la classe d'héritage « top plus » quelque temps dans une certaine condition. Par exemple, si vous avez un objet qui est en lecture seule et vous ne pouvez pas le mettre en arrière, mais que vous pouvez l'utiliser dans une classe d'enfants, je ne vois pas pourquoi je devrais avoir un Protégez-vous pour avoir accès à cette variable. Une simple variable protégée faire la même encapsulation parce que vous ne pouvez pas définir cette variable et vous pouvez accéder à cette variable uniquement de la classe enfant.

set / get est la façon de le faire pour d'autres cas.

Ceci est un compromis ici. Setters et getters sont un peu plus lent que l'accès aux champs directement, donc si vous faites les mathématiques lourds et lire / écrire ces champs beaucoup dans vos sous-classes, vous devez aller pour accéder aux champs directement. Mais cela est plus comme une exception.

Normalement, vous devez les marquer comme privé et aller getters / setters.

Donc, ma réponse est: un accès direct pour les champs fortement utilisés, getters / setters autrement. Utilisez le bon sens.

EDIT:. Je l'ai fait un certain profilage et apparemment même en mode de sortie, il peut y avoir la différence de vitesse de 20% entre les champs et propriétés Voir mon cas de test ici: http://pastebin.com/m5a4d1597

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top