IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Explication simple du mot clé "virtual" [Débutant]


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 202
    Par défaut Explication simple du mot clé "virtual"
    Bonjour,

    Malgré toute l'aide qu'il y a sur le net ( et pour ce genre de choses c'est pas ça qui manque) , je n'arrive pas très bien à comprendre l'utilité du mot clé virtual...
    Je suis allé sur google et sur MSDN là ou il y a des exemples mais ça reste assez flou pour moi...
    Quelqu'un aurait un exemple vraiment "bateau" pour m'expliquer ça ?
    merci d'avance pour votre aide...
    Cdt.

  2. #2
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    Bonjour,

    Si tu veux comprendre le mot clé "virtual" il faut que t 'es parfaitment integré la notion de polymorphisme et la notion d'instance et de référence.

    Le mot clé virtual permet d'avoir un comportement au niveau de l'heritage des méthode équivalent a celui de java, c'est a dire on utilisera toujours la méthode la plus dérivé c'est a dire celui de l'instance. Sans le mot virtual on utilisera toujours la méthode de la référence.

    Pour être plus claire un exemple :

    Sans virtual (comportement par défaut) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Voiture
    {
      public string Rouler {get  {return "Je roule comme une voiture";}}
    }
     
    public class v4x4 : Voiture
    {
    public string Rouler {get {return "je roule comme un 4x4";}}
    }
    A l'utilisation on aura les resultat suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Voiture v1 = new Voiture();
    Voiture v2 = new v4x4();
    v4x4 v3=new v4x4();
    v1 dira "je roule comme une voiture";
    v2 dira "je roule comme une voiture";
    v3 dira "je roule comme un 4x4";

    Tu vois que la méthode est appelée en fonction de la référence.

    Maitenant en retouchant tes classes ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Voiture
    {
      public virtual string Rouler {get  {return "Je roule comme une voiture";}}
    }
     
    public class v4x4 : Voiture
    {
    public override string override Rouler {get {return "je roule comme un 4x4";}}
    }
    A l'utilisation on aura les resultat suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Voiture v1 = new Voiture();
    Voiture v2 = new v4x4();
    v4x4 v3=new v4x4();
    v1 dira "je roule comme une voiture";
    v2 dira "je roule comme un 4x4";
    v3 dira "je roule comme un 4x4";

    La méthode est appellée en fonction de la référence réelle : on a un vrai comportement polymorphe.

    Tu peut aller plus loin avec les interfaces car du coup pour une même methode tu peut avoir une implementation de classes et une d'interface.... Je te laisse faire des essais.

    En esperant t'avoir eclairé.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    @worm83, sans virtual ton premier exemple ne compile pas... on ne peut pas faire d'override sur une méthode non virtuelle.

  4. #4
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    Oui désolé en plus je m'en suis rendu compte mais j'ai oublié de corriger. Ca y'est c'est fait ^^

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Pour expliquer plus simplement : l'implémentation d'une méthode virtuelle peut être redéfinie dans une classe dérivée. Ce qui veut dire que quand tu appelles une méthode virtuelle (par exemple Rouler) sur une variable de type Voiture, l'implémentation qui sera effectivement appelée dépendra du type de voiture (un 4x4, une berline...).

    Alors que si la méthode n'est pas virtuelle, c'est toujours l'implémentation de la classe Voiture qui sera appelée. Les classes dérivées peuvent définir une méthode Rouler avec la même signature, mais ce sera une nouvelle méthode, sans rapport avec la méthode Rouler de la classe Voiture, et elle ne pourra être appelée que via une variable du type qui la définit.

    (je suis pas sûr que ce soit beaucoup plus clair... le concept semble assez simple une fois que tu l'as compris, mais il n'est pas très facile à expliquer simplement )

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 202
    Par défaut
    Merci à vous deux, je pense que c'est plus clair là...

    Simplement dans cet exemple là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Voiture
    {
      public virtual string Rouler {get  {return "Je roule comme une voiture";}}
    }
     
    public class v4x4 : Voiture
    {
    public override string override Rouler {get {return "je roule comme un 4x4";}}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Voiture v1 = new Voiture();
    Voiture v2 = new v4x4();
    v4x4 v3=new v4x4();
    V2 est un objet voiture ou 4x4?
    Je dirais intuitivement voiture mais il appelle la méthode de 4x4 c'est ça ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par arngrimur Voir le message
    V2 est un objet voiture ou 4x4?
    Je dirais intuitivement voiture mais il appelle la méthode de 4x4 c'est ça ?
    Bah les 2... un 4x4 est une voiture

    Plus précisément : la variable v2 (de type Voiture) contient une référence vers un objet de type v4x4. C'est lors de l'appel à la méthode que le système détermine quelle méthode appeler, selon le type réel de l'objet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Difference entre [Simple quote] & [Double quote]
    Par Invité dans le forum SQL
    Réponses: 3
    Dernier message: 24/07/2013, 12h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo