2010-12-10 13 views
1

Il semble que je devrais savoir cela et je pensais que je l'ai fait. J'ai la classe de base de la vue, dans laquelle j'ai plusieurs propriétés mais elles utilisent toutes des getters et des setters automatiques donc bien sûr tout fonctionne bien, mais j'en ai un qui doit diffuser un évènement (j'utilise le prisme) comme ça.C# question sur les propriétés de la classe de base

protected bool isValid; 
public bool IsValid 
{ 
    get { return isValid; } 
    set 
    { 
    isValid = true; 
    this.EventAggregator.GetEvent<ViewModelValidEvent>().Publish(isValid); 
    } 
} 

Le problème que je reçois est lorsque je tente d'assigner IsValid dans une classe dérivée de celle-ci - l'erreur du compilateur dit qu'il est en lecture seule ... Je pensais protégé était ce que je dois faire pour corriger il n'a pas.

En outre - Je continue à devoir déclarer ces variables privées pour tout quand j'ai besoin du setter pour appeler RaisePropertyChanged ou quoi que ce soit ... Y at-il une meilleure façon de faire cela?

Quelqu'un peut-il me diriger dans la bonne direction? Merci!!!

+0

Un montage de Jeff Atwood, et une réponse de Jon Skeet :) L'éclairage d'épreuve peut frapper deux fois au même endroit. –

Répondre

3

Je suppose que vous essayez d'utiliser isValid sur un objet qui n'est pas connu (par le compilateur) comme étant une instance de la classe dérivée ou une sous-classe de la classe dérivée. protected a une sémantique relativement subtile comme ça.

Personnellement, je vous encourage à garder vos champs privés, et à utiliser des propriétés de n'importe quelle autre classe - même une classe dérivée. En ce qui concerne une façon plus simple de mettre en œuvre les propriétés - je ne pense pas qu'il y en ait vraiment, non. Vous pourriez avoir un type wrapper, mais vous auriez toujours besoin de créer une variable pour contenir l'instance du type wrapper, et les accesseurs get/set pour proxy à la variable.

+0

cool, j'ai une réponse de Jon Skeet ... – Kenn