8
votes

Mot-clé virtuel en C #

J'ai une connaissance de Java et j'ai appris C # depuis deux jours. Maintenant, j'ai rencontré le mot-clé "virtuel" qui, comme suggéré à Ce lien est utilisé pour permettre la nervure des méthodes, des 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 c'est nécessaire?


4 commentaires

"Maintenant, je pense que nous pouvons remplacer les méthodes même sans utiliser le mot-clé" virtuel "." Tu penses?


@Boltclock certainement. Abstract dans la classe de base et Remplacement dans la classe dérivée suffit. Pas besoin de virtuel : p


Oui, des moyens virtuels "Je fournis une implémentation, mais vous pouvez le remplacer polymorphiquement" et des moyens abstraits "Je définit quelque chose que vous devez fournir une mise en œuvre pour, qui agira polymorphiquement". Contrairement à l'observation (généralement considérée comme sous-optimale), les signatures de fonction doivent correspondre.


@CODESINCHAOS: Eh bien, ouais;)


5 Réponses :


2
votes

Maintenant, je pense que nous pouvons remplacer les méthodes même sans utiliser le mot-clé "virtuel".

Non, vous ne pouvez pas. Contrairement à Java, dans C # Les membres sont scellés par défaut et vous ne pouvez pas les remplacer à moins que vous ne les ai marqués avec le mot clé


0 commentaires

7
votes

virtuel est un moyen de définir qu'une méthode a une implémentation par défaut, mais que cette mise en œuvre peut être remplacée dans une classe enfant. Autre qu'en utilisant virtual, vous ne pouvez pas remplacer une méthode directement sans utiliser le mot-clé nouveau (qui est généralement une mauvaise pratique).

Un bon exemple de la mise en oeuvre de virtuel est la méthode tostring () . Chaque objet de C # est garanti d'appeler Tostring () car chaque objet hérite de la classe System.Object Classe contenant une méthode virtuelle Tostring ( ) . Les classes dérivées peuvent toutefois remplacer cela et fournir leur propre implémentation qui peut être plus utile pour les utilisateurs de l'objet.

Mise à jour: J'ai récemment écrit un article de blog qui passe dans ce sujet dans un peu de profondeur. Vérifiez-le ici .


0 commentaires

13
votes

Vous avez besoin du mot clé virtuel si vous voulez vraiment de remplacement méthodes dans des sous-classes. Sinon, la mise en œuvre de la base sera masquée par la nouvelle implémentation, tout comme si vous l'aviez dit avec le mot-clé nouveau .

Cacher les méthodes en "le remplacement" sans la méthode de base déclarée virtuel vous laisse sans polymorphisme, cela signifie: Si vous "lancer" une version spécialisée à la version "Base" et appelez une méthode, la mise en œuvre des classes de base sera utilisée à la place de la version remplacée - qui n'est pas Ce que vous attendiez.

Exemple: xxx


0 commentaires

1
votes

Jetez un oeil à cet exemple: xxx

dans cet exemple, la sous-classe s est instanciée et attribuée à une variable d'objet o1 . Dans le paramètre Console.writeline L'instruction Il est apparu dans la classe de base B , puis méthode m1 est appelé. Parce que nous avons utilisé virtual dans la classe de base b et remplacer dans la sous-classe s , nous obtenons < / p>

remplace M1

comme sortie. Si vous supprimez virtual dans la déclaration de méthode de M1 dans B et remplacer dans la sous-classe s < / code> alors vous obtenez

m1

comme sortie, ce qui signifie que la distribution a également pour effet que la déclaration originale de méthode m1 dans la classe de base b est utilisé.

nb si vous utilisez le mot-clé nouveau dans la sous-classe s , tel que xxx < / pré>

supposant que le mot clé virtuel dans la classe de base b est absent, vous obtenez la sortie

m1

aussi. Si vous ne le jeterez pas à B , la nouvelle méthode serait utilisée. Ceci s'appelle ombrage (ou masquant ) une méthode (la méthode d'origine de la classe de base).

Résumé:

  • Pour remplacer une méthode, qui devrait également être efficace si vous lancez à la classe de base, utilisez le mot-clé dans la classe de base et de remplacement dans le Sous-classe.

  • Si vous avez l'intention de remplacer la méthode, qui devrait être active dans la classe Sous-classe, utilisez le mot-clé Nouveau dans la déclaration de méthode des sous-classes. Comme vous l'avez vu, cela fonctionne aussi sans cela, mais il est préférable que ce soit là-bas, alors tout le monde sait qu'il s'agit d'une nouvelle version de la méthode.


0 commentaires

0
votes

virtuel / remplacement permettra à la classe dérivée de remplacer la fonction de base si la classe dérivée est instanciée comme classe de base. Exemple: xxx


0 commentaires