124 votes

mot clé New 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 l' new mot-clé en 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?

En quoi diffèrent override?

114voto

Kelsey Points 26456

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

public class A
{
   public virtual void One();
   public void Two();
}

public class B : A
{
   public override void One();
   public new void Two();
}

B b = new B();
A a = b as A;

a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B

Modifier peut être utilisé uniquement dans des cas très spécifiques. À partir de MSDN:

Vous ne pouvez pas remplacer un non-virtuelle ou méthode statique. Le substituée base la méthode doit être virtuel, abstrait, ou override.

De sorte que le "nouveau" mot clé est nécessaire pour vous permettre de "remplacement" non virtuelle et méthodes statiques.

66voto

BFree Points 46421

Non, ce n'est pas vraiment "nouveau" (pardonnez le calembour). Il est essentiellement utilisé pour "cacher" une méthode. C'est à dire:

public class Base
{
   public virtual void Method(){}
}

public class Derived : Base
{
   public new void Method(){}
}

Ensuite, si vous faites cela:

Base b = new Derived();
b.Method();

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.

25voto

Dan Herbert Points 38336

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.

Gardez à 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:

public class BaseClass
{
    public void DoSomething() { }
}

Et puis la classe dérivée:

public class DerivedType
{
    public new void DoSomething() {}

}

Si vous déclarez un type d' DerivedType puis de voter pour elle, la méthode DoSomething() n'est pas polymorphe, il va appeler la classe de base de la méthode, pas la dérivée.

BaseClass t = new DerivedType();
t.DoSomething();// Calls the "DoSomething()" method of the base class.

9voto

jonnii Points 17046

À partir 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éritez 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 de la rétro-compatibilité.

Il y a beaucoup d'informations dans la MSDN pour cela.

4voto

Robin Clowers Points 1352

Cela signifie que la méthode remplace une méthode par le même nom, hérité de 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X