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 :

Questionnement sur "virtual"


Sujet :

C#

  1. #1
    Membre régulier Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Points : 76
    Points
    76
    Par défaut Questionnement sur "virtual"
    Bonjour,

    Je débute en C# et me suis récement apercu que la redéfinition d'une méthode dans une classe qui hérite d'une autre ne fonctionnait pas comme en Java.

    En effet, si on a : classe C2 hérite de C1 et C1.truc() redéfini dans C2. alors, il faut que C1.truc() soit défini avec le mot clé "virtual" pour que l'appel à la méthode truc() depuis un objet de type C2 casté en C1 éxécute bien C2.truc().Autrement, c'est la méthode C1.truc() qui est appelée.

    On peut donc en conclure que pour retrouver le comportement de Java, il faut déclarer toutes ses méthodes avec le mot clé virtual (et toutes les redéfinitions avec le mot clé "override"). Ce qui veut dire que Microsoft a choisi que, par défaut, les méthodes d'une classes ne pourraient pas etre redéfinie "en profondeur" dans les classes enfant.

    A premiere vue, ce choix me parait tout à fait criticable et je suis meme décu de découvrir cette subtilité.

    C'est pourquoi je m'intéroge sur les raisons de ce choix et me tourne vers vous , ésperant oobtenir quelques éléments de réponse...

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    En effet, en C#, pour pouvoir surcharger une méthode avec le mot-clé override, il faut que dans la classe mere, la méthode soit marquée comme virtual.

    Qu'est ce qui est, selon toi, le plus logique lorsque tu développes une classe:
    - permettre à ceux qui hériteront de ta classe de pouvoir surcharger les méthodes de ta classe, sans forcément savoir qui fait quoi et ainsi leur donner la possibilité de surcharger des méthodes qui ne doivent pas l'être
    - ne permettre la surcharge d'une méhode que lorsque tu le décides et éviter que toutes tes méthodes puissent-être surchargées.

    La 2ème solution me semble la mieux

  3. #3
    Membre régulier Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Points : 76
    Points
    76
    Par défaut
    Ce qui me gène, c'est que le comportement par défaut deviens naturellement le plus utilisé. Ce qui veut dire que, au final, on se retrouve avec des classes qu'on ne peut pas étendre comme on veut. Il me semble trés difficile quand on programme une classe d'imaginer toutes les facons de l'étendre par la suite. Il me parait donc plus logique de permettre, par défaut, la redéfinition des méthodes mais de permettre de l'interdire, au cas par cas, quand cela s'avère nécessaire... C'es la philosophie adoptée par Java et il ne me semble pas que cela pose problème.

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par monstroplante
    C'es la philosophie adoptée par Java et il ne me semble pas que cela pose problème.
    Et curieusement, je n'ai jamais vu personne se poser la question à propos de la "philosophie" employée par C#... encore une différence entre les 2 langages

  5. #5
    Membre régulier Avatar de monstroplante
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 107
    Points : 76
    Points
    76
    Par défaut
    Je ne suis pas sur d'avoir bien compris ton dernier message.

    En tout cas, pour le moment, je trouve ce choix plus restrictif qu'autre chose. Mais ca ne fait pas longtemps que je programme en objet. Peut etre que je changerais d'avis plus tard...

    Toutefois, j'ai l'impression que ca ne met pas tout le monde d'accord :
    En Java, toutes les méthodes sont par défaut virtuelles alors qu'en C#, comme en C++, le développeur doit explicitement l'indiquer. C'est pourquoi, C# propose un mot-clé n'ayant pas d'équivalent en Java : virtual. Ici encore, cette caractéristique a toujours été source de moult discussions entre pour et contre. Néanmoins, il faut noter que la nature virtuelle des méthodes constitue un frein aux optimisations de la machine virtuelle devant prévoir l'extensibilité de la classe en question. Une autre raison dans le choix de C# pourrait s'expliquer par le fait que les méthodes virtuelles peuvent être accidentellement redéfinies par le développeur dans une sous-classe. Dans ce cas, l'appel à la méthode de la classe mère sera masqué par la méthode fille et pourrait engendrer des résultats inexplicables.
    obligation de déclarer les fonctions pouvant être surcharger et aussi quand on effectue la surcharge ( qu'est ce que c'est lourd!!! ( ).
    Source : http://java.pere-nono.com/comparatif.htm

Discussions similaires

  1. [Quote] DVP quoté sur Bashfr
    Par Skyounet dans le forum La taverne du Club : Humour et divers
    Réponses: 16
    Dernier message: 26/09/2006, 18h52

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