Lors d'un refactoring, j'ai fini par créer une méthode comme l'exemple ci-dessous. Le type de données a été modifié par souci de simplicité.
J'avais auparavant une déclaration de mission comme celle-ci:
MyObject myVar = new MyObject();
Il a été remanié à ceci par accident:
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
C'était le résultat d'une erreur de copier / coller de ma part, mais le new
mot clé in private static new
est valide et compile.
Question : Que signifie le new
mot - clé dans une signature de méthode? Je suppose que c'est quelque chose d'introduit dans C # 3.0?
En quoi cela diffère- override
t-il?
new
comme modificateur sur une méthode (ou un autre membre de type) n'est pas "quelque chose d'introduit dans C # 3.0". Il existe depuis la première version de C #.Réponses:
Nouvelle référence de mot clé de MSDN:
Référence MSDN
Voici un exemple que j'ai trouvé sur le net d'un MVP Microsoft qui avait du bon sens: Lien vers l'original
Le remplacement ne peut être utilisé que dans des cas très spécifiques. Depuis MSDN:
Le mot-clé «nouveau» est donc nécessaire pour vous permettre de «remplacer» les méthodes non virtuelles et statiques.
la source
new
, mais je pense que ce n'est littéralement là que pour la lisibilité - le compilateur vous avertit simplement que lorsque vous appelez une méthode de classe dérivée du même nom que base, vous n'obtiendrez pas la méthode de la classe de base que vous pouvez pensez ... c'est bizarre ... uniquement pour la lisibilité?IMyInterface
l'implémentation sur la classe Derived sera appelée. AinsiIMyInterface c = new B()
appellera l'implémentation de la classe B. Si une seule classe implémente l'interface, la méthode de la classe qui l'implémente sera appelée.Non, ce n'est en fait pas «nouveau» (pardonnez le jeu de mots). Il est essentiellement utilisé pour «cacher» une méthode. C'EST À DIRE:
Si vous faites ensuite ceci:
La méthode de la base est celle qui sera appelée, PAS celle de la méthode dérivée.
Quelques informations supplémentaires: http://www.akadia.com/services/dotnet_polymorphism.html
Re votre modification: Dans l'exemple que j'ai donné, si vous deviez "remplacer" au lieu d'utiliser "new" alors quand vous appelez b.Method (); la méthode de la classe dérivée serait appelée à cause du polymorphisme.
la source
Comme d'autres l'ont expliqué, il est utilisé pour masquer une méthode existante. C'est utile pour remplacer une méthode qui n'est pas virtuelle dans la classe parent.
Gardez à l'esprit que la création d'un "nouveau" membre n'est pas polymorphe. Si vous transtypez l'objet vers le type de base, il n'utilisera pas le membre du type dérivé.
Si vous avez une classe de base:
Et puis la classe dérivée:
Si vous déclarez un type de
DerivedType
et que vous le castez, la méthodeDoSomething()
n'est pas polymorphe, elle appellera la méthode de la classe de base, pas celle dérivée.la source
override
de signature de méthodenew
masquer le type de base du type dérivé, car ne pouvez-vous pas toujours accéder au type de base en utilisant labase.<type>
notation?base.<method>
, et peut également être appelé en externe si vous convertissez le type de base dans votre code. Il est techniquement plus précis de le considérer comme «écrasant» la méthode de base que comme «masquant».À partir de la documentation:
Si la méthode de la classe dérivée est précédée du mot-clé new, la méthode est définie comme étant indépendante de la méthode de la classe de base.
Ce que cela signifie en pratique:
Si vous héritez d'une autre classe et que vous avez une méthode qui partage la même signature, vous pouvez la définir comme «nouvelle» afin qu'elle soit indépendante de la classe parente. Cela signifie que si vous avez une référence à la classe «parent», cette implémentation sera exécutée, si vous avez une référence à la classe enfant, cette implémentation sera exécutée.
Personnellement, j'essaie d'éviter le mot-clé «nouveau» car cela signifie normalement que ma hiérarchie de classes est erronée, mais il y a des moments où cela peut être utile. Un endroit est pour la gestion des versions et la compatibilité ascendante.
Il y a beaucoup d'informations dans le MSDN pour cela .
la source
new
présence. C'est syntaxique / lisibilité.Cela signifie que la méthode remplace une méthode par le même nom hérité par la classe de base. Dans votre cas, vous n'avez probablement pas de méthode portant ce nom dans la classe de base, ce qui signifie que le nouveau mot-clé est totalement superflu.
la source
Pour faire court - ce n'est PAS nécessaire, cela ne change AUCUN comportement et il est PUREMENT là pour la lisibilité.
C'est pourquoi dans VS, vous verrez un peu ondulé, mais votre code se compilera et fonctionnera parfaitement bien et comme prévu.
Il faut se demander si cela valait vraiment la peine de créer le
new
mot - clé alors que tout cela signifie que le développeur reconnaît: "Oui, je sais que je cache une méthode de base, oui je sais que je ne fais rien en rapport avecvirtual
ouoverriden
(polymorphisme) - Je veux vraiment créer sa propre méthode ».C'est un peu bizarre pour moi, mais peut-être seulement parce que je viens d'un
Java
arrière-plan et qu'il y a cette différence fondamentale entre l'C#
héritage etJava
: DansJava
, les méthodes sont virtuelles par défaut, sauf si spécifié parfinal
. DansC#
, les méthodes sont finales / concrètes par défaut, sauf si spécifié parvirtual
.la source
Depuis MSDN :
la source
Faites attention à ce piège.
Vous avez une méthode définie dans une interface qui est implémentée dans une classe de base. Vous créez ensuite une classe dérivée qui masque la méthode de l'interface, mais ne déclarez pas spécifiquement la classe dérivée comme implémentant l'interface. Si vous appelez ensuite la méthode via une référence à l'interface, la méthode de la classe de base sera appelée. Cependant, si votre classe dérivée implémente spécifiquement l'interface, sa méthode sera appelée quel que soit le type de référence utilisé.
la source