web-dev-qa-db-fra.com

Et si je n'écoute pas l'avertissement "masque le membre hérité. Pour que le membre actuel remplace cette implémentation ..."

C'est peut-être un bon point, mais cela concerne l'avertissement que le compilateur émet si vous faites quelque chose comme:

class A
{
    public virtual void F() { }
}
class B : A
{
    public void F() { }
}

Ensuite, vous obtenez l'avertissement:

'EomApp1.B.F()' hides inherited member 'EomApp1.A.F()'.
To make the current member override that implementation, add the override keyword. Otherwise use the new keyword.

image of error message

QUESTION: Quel est l'avertissement qui m'avertira réellement si je ne fais rien à ce sujet? Mon programme fonctionnera-t-il différemment si j'ajoute le "nouveau" mot clé par rapport à ce que je ne fais pas?

(Remarque: je sais que je pourrais tester cela assez facilement, mais j'ai pensé que cela valait la peine de le demander ici)

30
Aaron Anodide

Il ne fera rien mais la méthode que vous avez là F() n'est pas non plus polymorphe. Il devient très facile de se tromper dans le code si vous avez commencé à utiliser la référence de la classe de base, donc vous êtes averti. Bien sûr, cela peut être ce que vous voulez, donc le nouveau mot-clé le rend plus explicite

Par exemple.

B b1 = new B();
b1.F(); // will call B.F()

A b2 = new B();
b2.F(); // will call A.F()

Maintenant, si vous ajoutez la classe C avec new, elle se comportera de la même manière que B. Si vous ajoutez la classe D avec override, alors F devient polymorphe:

class C : A
{
    public new void F() { }
}

class D : A
{
    public override void F() { }
}

// Later

C c1 = new C();
c1.F(); // will call C.F()

A c2 = new C();
c2.F(); // will call A.F()

D d1 = new D();
d1.F(); // will call D.F()

A d2 = new D();
d2.F(); // will call D.F()

Voir ce violon .

21
Fadrian Sudaman

Non, le comportement par défaut est exactement le même que si vous utilisez new, sauf si l'avertissement est donné. D'après mon expérience, vous avez plus souvent en fait voulez spécifier override au lieu de new, car il s'agit généralement juste d'un cas d'oubli de remplacer explicitement.

Si vous voulez vraiment faire une méthode complètement distincte, et si vous avez la option d'utiliser un nom différent à la place, je prendrais cette approche. Avoir une méthode en cachant une autre généralement réduit considérablement la lisibilité OMI. Ce n'est pas trop mauvais si le but est juste de donner un type de retour plus spécifique (et vous vous assurez que la méthode plus faiblement typée retourne la même valeur), mais c'est un cas assez rare.

25
Jon Skeet
3
FIre Panda

C'est juste un avertissement. Le code fonctionnera. Dans certaines circonstances, cet avertissement peut entraîner un problème.

utilisez nouveau mot-clé avec la méthode que vous appelez à partir de la classe de base.

class A
{
    public virtual void F() { }
}
class B : A
{
   new public void F() { }
}

Référence

https://msdn.Microsoft.com/en-us/library/435f1dw2.aspx

https://msdn.Microsoft.com/en-us/library/aa691135 (v = vs.71) .aspx

0