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? P>
5 Réponses :
Maintenant, je pense que nous pouvons remplacer les méthodes même sans utiliser le mot-clé "virtuel". P> blockQuote>
Non, vous ne pouvez pas. Contrairement à Java, dans C # Les membres sont
scellés par défaut forts> et vous ne pouvez pas les remplacer à moins que vous ne les ai marqués avec le mot clé code> p>
Un bon exemple de la mise en oeuvre de 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 . P> virtuel code> est un moyen de définir qu'une méthode a em> 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 code> (qui est généralement une mauvaise pratique). P>
virtuel code> est la méthode
tostring () code>. Chaque objet de C # est garanti d'appeler
Tostring () code> car chaque objet hérite de la classe
System.Object code> Classe contenant une méthode virtuelle
Tostring ( ) code>. 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. P>
Vous avez besoin du mot clé code> virtuel > si vous voulez vraiment Cacher les méthodes en "le remplacement" sans la méthode de base déclarée Exemple: p> de remplacement code> 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 code>.
virtuel code> 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. p>
Jetez un oeil à cet exemple: dans cet exemple, la sous-classe remplace M1 p>
blockQuote> comme sortie. Si vous supprimez m1 p>
blockquote> comme sortie, ce qui signifie que la distribution a également pour effet que la déclaration originale de méthode nb strud> si vous utilisez le mot-clé supposant que le mot clé code> virtuel code> dans la classe de base m1 p>
BlockQuote> aussi. Si vous ne le jeterez pas à Résumé: strong> p> Pour remplacer une méthode, qui devrait également être efficace si vous lancez à la classe de base, utilisez le mot-clé code> code> dans la classe de base et Si vous avez l'intention de remplacer la méthode, qui devrait être active dans la classe Sous-classe, utilisez le mot-clé s code> est instanciée et attribuée à une variable d'objet
o1 code>.
Dans le paramètre
Console.writeline Code> L'instruction Il est apparu dans la classe de base
B code>, puis méthode
m1 code> est appelé.
Parce que nous avons utilisé
virtual code> dans la classe de base
b code> et
remplacer code> dans la sous-classe
s code>, nous obtenons < / p>
virtual code> dans la déclaration de méthode de
M1 code> dans
B code> et
remplacer code> dans la sous-classe
s < / code> alors vous obtenez p>
m1 code> dans la classe de base
b code> est utilisé. p>
nouveau code> dans la sous-classe
s code>, tel que p>
b code> est absent, vous obtenez la sortie p>
B code>, la nouvelle méthode serait utilisée. Ceci s'appelle ombrage em> (ou masquant em>) une méthode (la méthode d'origine de la classe de base). P>
de remplacement code> dans le Sous-classe. P> LI>
Nouveau code> 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. P> LI>
ul> p>
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:
"Maintenant, je pense que nous pouvons remplacer les méthodes même sans utiliser le mot-clé" virtuel "." Tu penses?
@Boltclock certainement.
Abstract Code> dans la classe de base et
Remplacement code> dans la classe dérivée suffit. Pas besoin de
virtuel code>: 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;)