none
Polymorphisme avec Object RRS feed

  • Question

  • Bonjour,

    J'ai créé 2 classes cl1 (avec une instance c1) et cl2 (avec une instance c2) avec une même méthode toto et je souhaite écrire une seule procédure qui aurait ce code :

    private void titi (Object obj) {obj.toto();}

    L'appel titi(c1) et titi(c2) ne pose pas de problème au compilateur.

    Le compilateur rejette l'écriture de ma procédure titi en me disant que 'object' ne contient pas de définition pour toto. Comment dois je faire pour lui dire d'interpréter dynamiquement l'appel et non au moment de son écriture ?

    Merci/

    vendredi 21 août 2015 08:58

Réponses

  • Bonjour,

    Ce que vous faîtes n'est pas POO, soit vos deux classes héritent d'une même classe parente (CParent) qui définit votre méthode toto() votre méthode titi devient :

    private void titi (CParent obj) {obj.toto();}

    Soit vous définissez une interface par exemple IToto :

    public interface IToto{
     void toto();
    }

    Et vous définissez c1 et c2 comme implémentant cette interface, titi devient :

    private void titi (IToto obj) {obj.toto();}

    Une dernières solution, mais qui n'est pas orienté objet et qui n'est pas fortement typé c'est d'utiliser les objets dynamique :

    private void titi (dynamic obj) {obj.toto();}
    Dans ce cas "toto" sera évaluer à l'exécution. Il faut être vigilant car une erreur (de nom par exemple) passera à la compilation mais pas lors de l'exécution, ce qui n'est pas conseillé si on veut faire une application solide.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    vendredi 21 août 2015 10:07
  • Merci, je ne connaissais pas ce type dynamic et cela répond à mon besoin immédiat.
    • Marqué comme réponse Lycee MATHIAS vendredi 21 août 2015 11:08
    vendredi 21 août 2015 11:08
  • Bonjour,

    Il existe aussi la solution :

    var castc1 = c1 as cl1;
    if (castc1 != null) castc1.toto();

    Ceci dit, dans tous les cas, c'est une mauvaise idée. Si vous êtes obligé de faire ce genre de manœuvre, c'est que vous avez un pb de conception.

    NB : merci de marquer la réponse de Yan comme réponse, pas la votre !


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 24 août 2015 07:13

Toutes les réponses

  • Bonjour,

    Ce que vous faîtes n'est pas POO, soit vos deux classes héritent d'une même classe parente (CParent) qui définit votre méthode toto() votre méthode titi devient :

    private void titi (CParent obj) {obj.toto();}

    Soit vous définissez une interface par exemple IToto :

    public interface IToto{
     void toto();
    }

    Et vous définissez c1 et c2 comme implémentant cette interface, titi devient :

    private void titi (IToto obj) {obj.toto();}

    Une dernières solution, mais qui n'est pas orienté objet et qui n'est pas fortement typé c'est d'utiliser les objets dynamique :

    private void titi (dynamic obj) {obj.toto();}
    Dans ce cas "toto" sera évaluer à l'exécution. Il faut être vigilant car une erreur (de nom par exemple) passera à la compilation mais pas lors de l'exécution, ce qui n'est pas conseillé si on veut faire une application solide.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    vendredi 21 août 2015 10:07
  • Merci, je ne connaissais pas ce type dynamic et cela répond à mon besoin immédiat.
    • Marqué comme réponse Lycee MATHIAS vendredi 21 août 2015 11:08
    vendredi 21 août 2015 11:08
  • Bonjour,

    Il existe aussi la solution :

    var castc1 = c1 as cl1;
    if (castc1 != null) castc1.toto();

    Ceci dit, dans tous les cas, c'est une mauvaise idée. Si vous êtes obligé de faire ce genre de manœuvre, c'est que vous avez un pb de conception.

    NB : merci de marquer la réponse de Yan comme réponse, pas la votre !


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 24 août 2015 07:13