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 :

Surcharger une méthode dans une dll.


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Surcharger une méthode dans une dll.
    Bonjour,

    Je ne maitrise absolument pas les dll donc il est tout à fait possible que la réponse à ma question soit simple : "impossible".

    Voila mon problème, j'ai une dll dont j'ai le code source. La condition qui m'est imposée est de ne pas recompiler la dll.
    Je voudrais ensuite simplement modifier une seule méthode, mais je n'ai absolument aucune idée de comment faire ça...

    J'ai pensé à étendre la classe, mais le problème c'est que je dois alors modifier les autres classes qui font appel à la classe d'origine... et comme la dll est assez importante (20aine de classes) j'ai le sentiment que je vais devoir toutes les modifier au final...

    Voila, je ne vois absolument pas comment faire, parce que je ne sais pas trop quelle magie se cache derrière les dll...

    Merci d'avance pour toute aide !
    Guillaume

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    Aucune magie ne se cache derrière les dlls !
    Conceptuellement, tout se passe comme si tes classes étaient dans un même projet. (à quelques exceptions près lorsqu'on parle de résolution de types)

    Ceci dit, tu ne pourras pas modifier ta methode à moins de l'overrider dans une classe dérivée... ceci implique qu'elle doit être "virtual".
    Si ce n'est pas le cas, c'est mort.

    Encore à une exception près : Tu peux overrider une methode non virtual en utilisant le mot clé "new" ... mais tu perds l'avantage du polymorphisme.
    Je m'explique.

    Si tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    class A
    {
       // peut être overridée : 
       public virtual void Methode1(){ Console.WriteLine("methode 1 dans A"); }
       // ne peut pas être overridée
       public void Methode2(){ Console.WriteLine("methode 2 dans A"); }
    }
    class B : A
    {
       public override void Methode1(){ Console.WriteLine("methode 1 dans B"); }
       public new void Methode2(){ Console.WriteLine("methode 2 dans B"); }
    }
     
    class Program
    {
         static void Main(string[] args){
              B bInstance = new B();
              A bInstanceAsA = (A)bInstance;
              bInstance.Methode1();
              bInstance.Methode2();
              bInstanceAsA .Methode1();
              bInstanceAsA .Methode2();
        }
    }
    Cet exemple donnera :

    methode 1 dans B
    methode 2 dans B
    methode 1 dans B
    methode 2 dans A => le polymorphisme est perdu : Lorsqu'utilisée en tant que A, la methode définie dans la classe B n'est pas utilisée.

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Oki je vois bien tout ça mais je voudrais en quelque sorte ré-écrire la Methode1 ou 2 dans ton exemple mais je voudrais qu'elle écrase la précédente car dans la dll, l'appel est fait la Methode1 de la classe A.
    Donc si j'écris la classe B qui en dérive, ok, mais tout le code de la dll n’appellera jamais ma nouvelles méthode :/
    Donc je dois modifier l'autre classe pour qu'elle appelle ma nouvelle fonction, mais je dois alors changer les autres classes qui faisaient appel à cette classe nouvellement modifiée, etcetc...

    Ce que je veux faire m'a l'air impossible en fait, mais c'est ce que je voudrais faire -_-
    Un peu comme si je ré-écrivais la Class A et que ma classe soit prise en priorité par rapport à celle de la dll (en gros)

    Complétement impossible ça ?

    Merci d'avance

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    Les seul scénario qui est possible est celui de la dérivation de classe pour te servir du polymorphisme.

    Je crains que tu soies dans une impasse si ça ne suffit pas

    Mais tu as raison, dès le début, ton problème est insoluble : "modifier une classe sans la modifier".IsCorrect() == false quoi qu'il arrive

  5. #5
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Pourquoi est ce que tu ne pars pas tout simplement sur un Wrapper de la classe qui est dans ta dll ?
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    J'ai pas tout compris...
    Une autre solution: le pattern adaptateur... Si tu as déjà une interface qui définit ta méthode à surcharger dans ta DLL non modifiable et que tout est appelé sur la base de cette interface....

Discussions similaires

  1. modifier un élément d'une form dans une méthode d'une autre form
    Par baldebaran dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/08/2009, 13h59
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. Réponses: 3
    Dernier message: 29/04/2008, 14h14
  4. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  5. "ajouter une méthode dans une méthode"
    Par Zorgloub dans le forum Langage
    Réponses: 1
    Dernier message: 09/04/2006, 12h53

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