7
votes

Utilisez un nouveau mot-clé en C #

J'ai deux classes xxx

alors j'écris du code qui déclare des instances de ces classes et appelle leurs méthodes xxx

i a donné le résultat suivant: xxx

mais quand je supprime le mot-clé Nouveauté de la méthode de la signature1 de la classe B et exécutez la méthode principale, j'ai le même résultat. Question: Le nouveau mot-clé est-il seulement dans la signature des méthodes uniquement pour une meilleure lisibilité?

EDIT: Y a-t-il des cas où nous ne pouvons pas faire sans nouveau mot-clé?


2 commentaires

Vous devez utiliser le remplacement ou le nouveau dans la classe B de la classe B sinon elle cache la méthode de l'élément parent. La valeur par défaut est nouvelle, donc si vous ne placez pas de nouveau, cela ne vous donne aucune erreur et ne fonctionne pas bien ..


Note latérale: Considérez «Confondre les lecteurs et les utilisateurs du code» d'être une utilisation principale de «Nouveau» dans ce contexte. Il y a des cas lors de l'utilisation de cela peut améliorer la lisibilité (c'est-à-dire de tirer de la classe pour une classe de base inamicale), mais dans la plupart des cas, il ne fera que plus de difficulté à comprendre lorsque la méthode de la classe de base sera appelée et une fois dérivée une.


3 Réponses :


6
votes

savoir quand utiliser le remplacement et les nouveaux mots-clés (Guide de programmation C #)

en C #, une méthode dans une classe dérivée peut avoir le même nom comme méthode dans la classe de base. Vous pouvez spécifier comment les méthodes interagissent en utilisant les mots clés neufs et remplacés. Le modificateur de remplacement prolonge la base Méthode de classe, et le nouveau modificateur le cache .

aussi

En utilisant NOUVEAU, vous affirmez que vous savez que le membre qu'il modifie masque un membre hérité de la base classe .


1 commentaires

La classe de base a-t-elle toujours besoin virtuel dans la méthode de Nouveau dérivé pour avoir un effet d'effet? Dans mes tests, avoir nouveau sur une classe dérivée a le même comportement que tout simplement ne pas avoir de remplacement - Qu'est-ce que je manque? Qu'est-ce que l'on entend par le cache ?



7
votes

Le nouveau mot-clé em> Laissez le lecteur de code Sachez que cette méthode masquera la méthode avec le même nom dans sa base. Même si vous l'avez envoyé, le compilateur le traiterait de la même manière, mais vous avertit à ce sujet.

Puisque vous avez déclaré la méthode comme virtuel em>, vous obtiendrez cet avertissement lorsque vous compilez: p>

'B.METOD1 () "Membre hérité" A.metod1 ()'. Pour que le membre actuel remplace cette implémentation, ajoutez le mot-clé de remplacement. Sinon ajoutez le nouveau mot-clé. p> blockquote>

Cependant, si vous modifiez la déclaration en supprimant virtuel em> comme: p>

  • Déclaration sans virtuel em> dans A code> p>

    abstract class A {
        public abstract void Metod1();
    }
    
    class B: A {
        public override void Metod1() { // use `new` instead of `override` would not compile
            Console.WriteLine("B.Method1");
        }
    }
    


2 commentaires

C'est bon, mais question: est nouveau mot clé dans la signature des méthodes uniquement pour une meilleure lisibilité et y a-t-il des cas où nous ne pouvons pas faire sans nouveau mot clé


Donc, il ne change aucun comportement - il est juste pour l'amour de la lisibilité ??



3
votes

Oui, vous êtes correct, c'est une meilleure lisibilité dans cette situation.

Mais vérifiez soigneusement que vous devriez avoir un avertissement pour ne pas utiliser de nouveau lors de la masquage de la méthode de base.

Vous pouvez lire plus ici: http://msdn.microsoft.com/en-us/library/vstudio /435f1dw2.aspx


4 commentaires

Vous avez écrit que c'est pour une meilleure lisibilité dans cette situation. Mais y a-t-il des situations où nous ne pouvons pas faire sans nouveau mot clé


@cosset Oui, quand il n'est pas utilisé comme modificateur, c'est-à-dire: classe1 c = nouvelle classe1 () ou lorsque vous avez défini pour traiter des avertissements comme des erreurs.


Y a-t-il des situations où nous ne pouvons pas faire sans nouveau mot clé dans la signature des méthodes, des champs


@Cosset Nouveau mot clé peut être utilisé comme opérateur, modificateur et contrainte dans une déclaration générique - uniquement lorsqu'il est utilisé comme modificateur, il peut être omis avec le prix d'un avertissement, dans les autres situations qu'il ne peut pas être omise sans changer le code sans modifier le code. comportement.