nouveau mot-clé dans la signature de la méthode
Lors de l'exécution d'un refactoring, j'ai fini par créer une méthode comme dans l'exemple ci-dessous. Le type de données a été modifiée par souci de simplicité.
Je le précédent avait une instruction d'affectation comme ceci:
MyObject myVar = new MyObject();
Il a été reconstruit à cet effet par accident:
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
C'était le résultat d'un copier/coller erreur de ma part, mais le new
mot-clé dans private static new
est valide et compile.
Question: Quel est le new
mot-clé signifier dans une signature de méthode? Je suppose que c'est quelque chose que introduit en C# 3.0?
Comment est-ce différent de override
?
- Quelques notes sur l'opportunité de la méthode de la fuite: blogs.msdn.com/ericlippert/archive/2008/05/21/...
- Great post. Je n'ai jamais pensé à la méthode de masquage de cette façon, comme dans oui, l'objet EST une chose, mais nous sommes maintenant en le présentant comme quelque chose d'autre, si nous voulons que le comportement de la chose que nous sommes présenter QUE. Intelligente...
- Une double question à l'avenir, et j'ai essayé de répondre dans le détail: l'Utilisation de nouveaux mots clés de c#
- L'utilisation de
new
comme un modificateur sur une méthode (ou un autre membre de type) n'est pas "quelque chose introduits dans C# 3.0". Il a été là depuis la première version de C#. - vous avez répété quelques réponses ci-dessous avec votre commentaire.
- stackoverflow.com/questions/9201344/...
Vous devez vous connecter pour publier un commentaire.
Nouvelle référence de mot clé de MSDN:
Référence MSDN
Voici un exemple que j'ai trouvé sur le net à partir d'un MVP Microsoft qui fait de bon sens:
Lien d'Origine
Modifier peut être utilisé uniquement dans des cas très spécifiques. À partir de MSDN:
De sorte que le "nouveau" mot clé est nécessaire pour vous permettre de "remplacement" non virtuelle et méthodes statiques.
new
est sur, mais je pense que c'est littéralement là seulement pour des raisons de lisibilité - le compilateur est tout simplement pour vous avertir que lorsque vous appelez la méthode de la classe dérivée de même nom que la base, vous n'aurez pas de classe de base de la méthode que vous pouvez penser.... c'est bizarre... purement pour des raisons de lisibilité?IMyInterface
la mise en œuvre sur la classe Dérivée sera appelée. AinsiIMyInterface c = new B()
fera appel à la mise en œuvre de la classe B. Si une classe implémente l'interface, la méthode de la classe qui l'implémente, sera appelée.Non, ce n'est pas vraiment "nouveau" (pardonnez le calembour). Il est essentiellement utilisé pour "cacher" une méthode. C'est à dire:
Ensuite, si vous faites cela:
La méthode de Base est celui qui sera appelé, PAS celui de la dérivée.
Quelques infos: http://www.akadia.com/services/dotnet_polymorphism.html
Re votre edit: Dans l'exemple que j'ai donné, si vous étiez à "substituer" au lieu d'utiliser "nouveau" puis quand vous appelez.b.Méthode(); la classe Dérivée de la Méthode doit être appelée en raison du Polymorphisme.
IMyInterface
la mise en œuvre sur la classe Dérivée sera appelée. AinsiIMyInterface i = new Derived()
fera appel à la mise en œuvre de la classe Dérivée. Si une classe implémente l'interface, la méthode de la classe qui l'implémente, sera appelée.Comme d'autres l'ont expliqué, il est utilisé pour masquer une méthode existante. Il est utile de surcharger une méthode qui n'est pas virtuelle dans la classe parent.
Garder à l'esprit que la création d'un "nouveau" membre n'est pas polymorphe. Si vous lancez l'objet pour le type de base, il n'utilisera pas le type dérivé du membre.
Si vous avez une classe de base:
Et puis la classe dérivée:
Si vous déclarez un type de
DerivedType
et puis la lancer, la méthodeDoSomething()
n'est pas polymorphe, il va appeler la classe de base de la méthode, pas la dérivée de l'un.override
dans la signature de la méthodenew
cache le type de base du type dérivé, parce que ne pouvez-vous pas toujours accès au type de base à l'aide de labase.<type>
notation?base.<method>
, et peut également être appelé de l'extérieur si vous en fonte pour le type de base dans votre code. C'est techniquement plus exact de penser à elle comme "primordial" la méthode de base que "cacher" il.De la documentation:
Si la méthode dans la classe dérivée est précédé du mot-clé new, la méthode est définie comme étant indépendants de la méthode dans la classe de base.
Ce que cela signifie dans la pratique:
Si vous hériter d'une autre classe et que vous avez une méthode qui partage la même signature que vous pouvez le définir comme "nouveau", de sorte qu'il est indépendant de la classe parent. Cela signifie que si vous avez une référence pour le "parent" de la classe alors que la mise en œuvre sera exécutée, si vous avez une référence à la classe enfant alors que la mise en œuvre sera exécutée.
Personnellement, j'essaie d'éviter le "nouveau" mot-clé signifie normalement j'ai ma hiérarchie de classe mal, mais il y a des moments où il peut être utile. Une place est pour la gestion des versions et compatibilité descendante.
Il y a beaucoup d'informations dans la MSDN pour cette.
new
être là. Il est syntaxique et la lisibilité.Il signifie que la méthode remplace la méthode du même nom héritée par la classe de base. Dans votre cas, vous n'avez probablement pas avoir une méthode de ce nom dans la classe de base, ce qui signifie le mot clé new est totalement superflu.
Longue histoire courte -- il n'est PAS nécessaire, il change PAS de comportement, et c'est uniquement là pour des raisons de lisibilité.
C'est pourquoi VS, vous verrez un peu ondulés, mais votre code de compiler et d'exécuter parfaitement bien et comme prévu.
Est de se demander si ça valait vraiment la création de la
new
mot-clé quand tout cela signifie, c'est que le développeur en reconnaissant "Oui, je sais que je me cache une méthode de base, oui, je sais que je ne vais pas faire tout ce qui est lié àvirtual
ouoverriden
(polymorphisme) -- j'ai vraiment envie de créer sa propre méthode".C'est un peu bizarre pour moi, mais peut-être seulement parce que je viens d'un
Java
de fond et il y a cette différence fondamentale entreC#
héritage etJava
: DansJava
, les méthodes sont virtuelles par défaut, sauf si spécifié parfinal
. DansC#
, les méthodes sont final/béton par défaut, sauf si spécifié parvirtual
.De MSDN:
Attention à ce piège.
Vous avez une méthode définie dans une interface qui est mis en œuvre dans une classe de base. Ensuite, vous créez une classe dérivée qui cache l'interface de la méthode, mais ne pas déclarer expressément la classe dérivée comme la mise en œuvre de l'interface. Si vous appelez la méthode via une référence à l'interface de la classe de base, la méthode sera appelée.
Toutefois, si votre classe dérivée n'est précisément de mettre en œuvre l'interface, puis sa méthode sera appelée quel que soit le type de référence est utilisée.