web-dev-qa-db-fra.com

Quelle est la différence entre le remplacement et les nouveaux mots clés en C #?

Quelle est la différence entre les mots clés override et new en C # lors de la définition de méthodes dans les hiérarchies de classes?

69
jaywayco

La page suivante résume très bien votre question.

Savoir quand utiliser le remplacement et les nouveaux mots clés

Résumé

Override : Lorsqu'une méthode d'une classe de base est surchargée dans une classe dérivée, la version de la classe dérivée est utilisée, même si le code appelant ne fonctionne pas. t "savoir" que l'objet était une instance de la classe dérivée.

Nouveau : Si vous utilisez le nouveau mot clé au lieu de remplacer, la méthode de la classe dérivée ne remplace pas la méthode de la classe de base, elle masque simplement il.

Si vous ne spécifiez ni new ni overrides, la sortie résultante est la même que si vous avez spécifié new, mais vous obtiendrez également un avertissement du compilateur (car vous ne savez peut-être pas que vous cachez une méthode dans la classe de base , ou bien vous souhaitiez peut-être la remplacer et avez simplement oublié d'inclure le mot-clé).

Override : utilisé avec le type de méthode virtual/abstract/override dans la classe de base

Nouveau : lorsque la classe de base n'a pas déclaré la méthode virtuelle/abstraite/remplacée

86
Brian Graham

new masquera la méthode avec une toute nouvelle méthode (qui peut ou non avoir la même signature) au lieu de la remplacer (auquel cas la nouvelle méthode doit avoir la même signature), ce qui signifie que le polymorphisme ne sera pas travail. Par exemple, vous avez ces classes:

class A {
    public virtual int Hello() {
        return 1;
    }
}

class B : A {
    new public int Hello(object newParam) {
        return 2;
    }
}

class C : A {
    public override int Hello() {
        return 3;
    }
}

Si tu fais ça:

A objectA;
B objectB = new B();
C objectC = new C();

Console.WriteLine(objectB.Hello(null)); // 2
Console.WriteLine(objectC.Hello()); // 3

objectA = objectB;

Console.WriteLine(objectA.Hello()); // 1

objectA = objectC;

Console.WriteLine(objectA.Hello()); // 3

Comme vous pouvez définir de nouvelles signatures de méthode avec new, il est impossible pour le compilateur de savoir que l'instance de A est en fait une instance de B et la nouvelle méthode B define devrait être disponible. new peut être utilisé lorsque la méthode, la propriété, le champ ou l'événement de l'objet parent n'est pas déclaré avec virtual, et en raison du manque de virtual le compilateur ne "regarde pas" up "la méthode héritée. Avec virtual et override, cependant, cela fonctionne.

Je vous recommande fortement d'éviter new; au mieux, c'est déroutant, car vous définissez une méthode avec un nom qui pourrait être reconnu comme autre chose, et au pire, cela peut cacher des erreurs, introduire des bogues apparemment impossibles et rendre l'extension des fonctionnalités difficile.

67
Ry-

Ressemble à une vieille question, permettez-moi d'essayer une réponse différente:

  1. new: comme son nom l'indique, il s'agit d'un nouveau membre dans la famille de la hiérarchie d'héritage et il sera utilisé comme membre de base pour la suite de la chaîne (s'il est marqué comme virtuel).

  2. override: Cela signifie que je n'accepte pas l'implémentation des membres de ma classe parent et que je ferai différemment.

9
Dhananjay

Considérez la hiérarchie de classes suivante:

using System;

namespace ConsoleApp
{     
     public static class Program
     {   
          public static void Main(string[] args)
          {    
               Overrider overrider = new Overrider();
               Base base1 = overrider;
               overrider.Foo();
               base1.Foo();

               Hider hider = new Hider();
               Base base2 = hider;
               hider.Foo();
               base2.Foo();
          }   
     }   

     public class Base
     {
         public virtual void Foo()
         {
             Console.WriteLine("Base      => Foo");
         }
     }

     public class Overrider : Base
     {
         public override void Foo()
         {
             Console.WriteLine("Overrider => Foo");
         }
     }

     public class Hider : Base
     {
         public new void Foo()
         {
             Console.WriteLine("Hider     => Foo");
         }
     }
}    

La sortie des codes ci-dessus doit être:

Overrider => Foo
Overrider => Foo

Hider     => Foo
Base      => Foo
  • Une sous-classe overrides une méthode virtuelle en appliquant le override modifier:
  • Si vous voulez hide un membre délibérément, auquel cas vous pouvez appliquer le new modifier au membre de la sous-classe. The new modifier does nothing more than suppress the compiler warning that would otherwise result
2
Sina Lotfi

override vous permet de remplacer une méthode virtuelle dans une classe de base afin que vous puissiez mettre une implémentation différente dans. new masquera une méthode non virtuelle dans une classe de base.

1
Daniel Mann