C# - l'utilisation du mot Clé virtual+remplacer vs nouvelle
Quelles sont les différences entre la déclaration d'une méthode dans une base de type "virtual
" et puis en substituant dans un enfant de type à l'aide de la "override
" mot-clé, par opposition à l'aide de la "new
" mot-clé lors de la déclaration de la méthode d'appariement de l'enfant type?
- MSDN dire "à l'Aide de
new
crée un nouveau membre avec le même nom et les causes de l'origine à devenir cachée, tandis queoverride
étend la mise en œuvre d'un membre hérité" - voir ce stackoverflow.com/questions/17717570/...
- MSDN - msdn.microsoft.com/en-us/library/ms173153.aspx
Vous devez vous connecter pour publier un commentaire.
Le "nouveau" mot clé ne modifie pas, elle signifie une nouvelle méthode qui n'a rien à voir avec la méthode de classe de base.
Cette impressions fausses, si vous avez utilisé le remplacer, il aurait imprimé vrai.
(Code de Base de la prise de Joseph Daigle)
Donc, si vous faites un véritable polymorphisme vous DOIT TOUJOURS l'emporter sur. Le seul endroit où vous devez utiliser la "nouvelle" est lorsque la méthode n'est pas lié de quelque façon à la version de classe de base.
virtual
dans la base etoverride
dans la dérivée? Pourquoi existe-t-elle? Le code fonctionne toujours, même w/onew
- est-il donc purement simplement la lisibilité?new
mot clé sur un champ de membre de déclaration n'a pas beaucoup de sens pour moi. Je pourrait encore appelerbase.Whatever
dans le corps de la fonctionJe trouve toujours des choses comme ça plus facile à comprendre avec des images:
De nouveau, en prenant joseph daigle code,
Si vous appelez ensuite le code comme ceci:
REMARQUE: La chose importante est que notre objet est en fait un
Bar
, mais nous sommes le stocker dans une variable de typeFoo
(ceci est similaire à un moulage)Alors le résultat sera comme suit, selon que vous avez utilisé
virtual
/override
ounew
lors de la déclaration de vos classes.Voici un peu de code pour comprendre la différence dans le comportement du virtuel et non virtuel méthodes:
new
de "cacher" la méthode de base, lorsque tout simplement pas en utilisant la substitution semble faire de même?virtual
et le compilateur va se plaindre si il voit le même nom de fonction sur une classe de "bloodline" sansvirtual
signatureLa
new
mot-clé crée en fait un tout nouveau membre qui n'existe que sur un type spécifique.Par exemple
La méthode existe sur les deux types. Lorsque vous utilisez réflexion et d'obtenir les membres de type
Bar
, vous allez effectivement trouver 2 méthodes appeléesDoSomething()
que regarder exactement la même chose. En utilisantnew
vous revient à masquer la mise en œuvre dans la classe de base, de sorte que lorsque les classes dérivent deBar
(dans mon exemple), l'appel de méthode àbase.DoSomething()
va àBar
et pasFoo
.virtuel /remplacer indique au compilateur que les deux méthodes sont liées et que, dans certaines circonstances, lorsque vous pensez que vous appelez le premier (virtuel) de la méthode, il est en fait correct d'appeler la deuxième (remplacée) méthode à la place. C'est la base du polymorphisme.
Fera appel à la sous-classe est surchargée VirtualFoo() la méthode.
nouveau indique au compilateur que vous ajoutez une méthode d'une classe dérivée avec le même nom qu'une méthode dans la classe de base, mais ils n'ont pas de rapport les unes avec les autres.
Fera appel à la BaseClass de NewBar() la méthode, considérant ce qui suit:
Fera appel à la sous-classe de NewBar() la méthode.
Au-delà des détails techniques, je pense que l'utilisation de virtual/remplacer communique beaucoup d'informations sémantiques sur la conception. Lorsque vous déclarez une méthode virtuelle, vous indiquez que vous vous attendez à ce que la mise en œuvre des classes souhaiterez peut-être fournir leur propre, non-implémentations par défaut. L'omission de cette dans une classe de base, de même, déclare l'espoir que la méthode par défaut devrait suffire pour toutes les classes. De même, on peut utiliser le résumé des déclarations à la force de la mise en œuvre de classes de fournir leur propre mise en œuvre. Encore une fois, je pense que cela communique beaucoup sur la façon dont le programmeur s'attend à ce que le code n'est utilisé. Si j'avais écrit à la fois la base et la mise en œuvre de classes et je me suis retrouvé à l'aide de nouveau, je serais sérieusement repenser la décision de ne pas faire de la méthode virtuelle dans le parent et déclare mon intention en particulier.
La différence entre le mot-clé override et un nouveau mot-clé est que le premier ne redéfinition de méthode et la méthode, plus tard, ne cachant.
Consulter le lien suivant sur les liens pour plus d'informations...
MSDN et D'autres
new
mot-clé est pour se Cacher. - signifie que vous cachez votre méthode au moment de l'exécution. La sortie sera basé méthode de classe de base.override
de remplacement. - signifie que vous êtes en invoquant votre méthode de la classe dérivée avec la référence de la classe de base. La sortie sera basée sur la méthode de la classe dérivée.Ma version de l'explication vient de l'utilisation propriétés pour aider à comprendre les différences.
override
est assez simple, non ? Le type sous-jacent remplace du parent.new
est peut-être trompeuse (pour moi c'était). Avec ces propriétés, il est plus facile à comprendre:À l'aide d'un débogueur, vous pouvez remarquer que
Foo foo
a 2GetSomething
propriétés, comme il a fait 2 versions de la propriété,Foo
's etBar
's, et de savoir lequel utiliser, c# "choix" de la propriété pour le type de courant.Si vous voulez utiliser la Barre de la version, que vous auriez utilisé remplacer ou de les utiliser
Foo foo
à la place.Bar bar
a seulement 1, comme il veut complètement nouveau comportement pourGetSomething
.Pas de marquage d'une méthode avec tout ce que signifie: Lier cette méthode à l'aide de l'objet type de compilation, pas de runtime type (statique de la liaison).
Marquage d'une méthode avec
virtual
signifie: Lier cette méthode à l'aide de l'objet runtime type, pas le temps de compilation de type (liaison dynamique).Marquage d'une classe de base
virtual
méthode avecoverride
dans la classe dérivée de moyens: C'est la méthode pour être relié à l'aide de l'objet de l'exécution de type (liaison dynamique).Marquage d'une classe de base
virtual
méthode avecnew
dans la classe dérivée de moyens: C'est une nouvelle méthode, qui n'a pas de relation de l'un avec le même nom dans la classe de base et il devrait être lié à l'aide de l'objet de la compilation de type (statique de la liaison).Pas de marquage d'une classe de base
virtual
méthode dans la classe dérivée signifie: Cette méthode est marqué commenew
(statique de la liaison).Marquage d'une méthode
abstract
signifie: Cette méthode est virtuelle, mais je ne vais pas déclarer un corps pour elle et sa classe est aussi abstrait (liaison dynamique).