mot-clé virtuel en c #

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.