J’ai des connaissances de java et ai appris c # au cours des deux derniers jours. Maintenant, je suis tombé sur le mot clé “virtual” qui, comme suggéré sur ce lien , permet d’autoriser les méthodes, propriétés, etc. correspondantes dans les sous-classes. Maintenant, je pense que nous pouvons remplacer les méthodes même sans utiliser le mot clé “virtuel“. Alors pourquoi est-ce nécessaire?
Vous avez besoin du mot-clé virtual
si vous voulez vraiment override
méthodes dans les sous-classes. Sinon, l’implémentation de base sera masquée par l’implémentation nouvelle, exactement comme si vous l’aviez déclarée avec le new
mot clé.
Masquer les méthodes en les “surchargeant” sans que la méthode de base soit déclarée virtual
vous laisse sans polymorphism, cela signifie que si vous “transposez” une version spécialisée dans la version “de base” et appelez une méthode, l’implémentation des classes de base sera toujours utilisée au lieu de la version remplacée – ce qui n’est pas ce que vous attendez.
Exemple:
class A { public void Show() { Console.WriteLine("A"); } } class B : A { public void Show() { Console.WriteLine("B"); } } A a = new A(); B b = new B(); a.Show(); // "A" b.Show(); // "B" A a1 = b; a1.Show(); // "A"!!!
virtual
est un moyen de définir qu’une méthode a une implémentation par défaut, mais que cette implémentation peut être remplacée dans une classe enfant. Sauf en utilisant virtuel, vous ne pouvez pas remplacer directement une méthode sans utiliser le new
mot-clé (ce qui est généralement une mauvaise pratique).
La méthode ToSsortingng()
est un bon exemple d’implémentation de virtual
. Il est garanti que chaque object de C # peut appeler ToSsortingng()
car chaque object hérite de la classe System.Object
base, qui contient une méthode virtuelle ToSsortingng()
. Les classes dérivées peuvent toutefois remplacer cette propriété et fournir leur propre implémentation qui peut être plus utile pour les utilisateurs de l’object.
Mise à jour: j’ai récemment écrit un article de blog qui aborde ce sujet de manière plus approfondie. Vérifiez ici .
Maintenant, je pense que nous pouvons remplacer les méthodes même sans utiliser le mot clé “virtuel”.
Non, tu ne peux pas. Contrairement à Java, les membres en C # sont scellés par défaut et vous ne pouvez les remplacer que si vous les avez marqués avec le mot-clé virtual
.
Jetez un oeil à cet exemple:
void Main() { var o1 = new S(); Console.WriteLine(((B)o1).m1()); } public class B { public virtual ssortingng m1() { return "m1"; } } public class S : B { override public ssortingng m1() { return "overridden m1"; } }
Dans cet exemple, la sous-classe S
est instanciée et affectée à la variable d’object o1
. Dans le paramètre de l’instruction Console.WriteLine
, il est converti dans la classe de base B
, puis la méthode m1
est appelée. Comme nous avons utilisé le virtual
dans la classe de base B
et le override
dans la sous-classe S
, nous obtenons
écrasé m1
en sortie. Si vous supprimez virtual
dans la déclaration de méthode de m1
dans B
et override
dans la sous-classe S
vous obtenez
m1
en sortie, ce qui signifie que la conversion a également pour effet d’utiliser la déclaration d’origine de la méthode m1
dans la classe de base B
NB: Si vous utilisez le new
mot-clé de la sous-classe S
, tel que
new public ssortingng m1() { return "overridden m1"; }
en supposant que le mot-clé virtual
dans la classe de base B
est absent, vous obtenez la sortie
m1
ainsi que. Si vous ne le convertissez pas en B
, la nouvelle méthode sera utilisée. C’est ce qu’on appelle l’ observation (ou la dissimulation ) d’une méthode (la méthode d’origine de la classe de base).
Résumé:
Pour remplacer une méthode, ce qui devrait également être efficace si vous transposez dans la classe de base, utilisez le mot clé virtual
dans la classe de base et override
dans la sous-classe.
Si vous avez l’intention de remplacer la méthode, qui ne devrait être active que dans la sous-classe, utilisez le new
mot-clé dans la déclaration de méthode de sous-classes. Comme vous l’avez vu, cela fonctionne aussi sans, mais c’est mieux si c’est là, donc tout le monde sait qu’il s’agit d’une nouvelle version de la méthode.