web-dev-qa-db-fra.com

Comment remplacer la méthode setter d'une propriété en C #?

J'ai une classe avec une sous-classe. La superclasse a une propriété Position. La sous-classe doit effectuer une opération supplémentaire lorsque la propriété Position est modifiée, donc j'essaie de remplacer la méthode setter et d'appeler le setter de la superclasse.

Je pense que j'ai le setter de superclasse appelant la partie vers le bas, mais je ne peux pas comprendre comment la syntaxe prioritaire fonctionne ici.

Voici ma meilleure tentative: code

Le getter est là juste pour la preuve de concept - supposons que je veuille outrepasser cela aussi?

Le getter et le setter me donnent des erreurs de cette forme:

ne peut pas remplacer le membre hérité 'superClassName.Position. [gs] et' car il n'est pas marqué comme virtuel, abstrait ou remplacer

Voici également un aperçu des erreurs pour faire bonne mesure: errors

J'ai également essayé d'utiliser le mot-clé override devant le set. La suppression du getter superflu n'a aucun effet.

Quelle est la syntaxe correcte?

26
Anko

Le remplacement est très bien. Cependant, comme l'indique le message d'erreur, vous devez marquer la propriété de la classe de base comme virtuelle pour pouvoir la remplacer:

public virtual Vector2 Position

Contrairement à Java, les membres de classe ne sont pas virtuels par défaut en C #. Si vous ne pouvez pas changer la classe de base, vous n'avez pas de chance.

38
dtb

Votre propriété Position n'est pas virtuelle dans la classe de base, vous ne pouvez donc pas la remplacer. Si vous le rendez virtuel, vous devriez pouvoir le remplacer.

Cela devient un peu désordonné de remplacer un bit sans l'autre - ce n'est pas le genre de chose que je fais très souvent, donc je devrais jouer avec pour m'assurer de ce qui se passe, mais le premier = la chose à faire serait de changer la propriété de la classe de base ...

C'est aussi exactement ce que le message du compilateur vous dit:

ne peut pas remplacer le membre hérité 'superClassName.Position. [gs] et' car il n'est pas marqué comme virtuel, abstrait ou remplacer

Cela vous dit quelque chose sur la propriété de classe de base - c'est donc ce que vous devez changer pour la remplacer. Les messages du compilateur sont là pour vous aider - portez-y une attention particulière!

7
Jon Skeet

dans votre classe de base: ajoutez le mot clé virtual

5
benwasd

Le problème vous est signalé dans le message d'erreur :)

Vous ne pouvez pas remplacer les membres qui ne sont pas virtuels (ou abstraits) en premier lieu.

Votre superclasse doit avoir virtual dans la définition de propriété:

public virtual Vector2 Position { ... }
5
Isak Savo

Vous ne pouvez pas remplacer les membres non marqués comme virtual ou abstract

Marquez votre Vector2 propriété dans une super classe comme virtual.

public virtual Vector2 Position
3
Tomasz Jaskuλa