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 :

Question sur l'héritage


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut Question sur l'héritage
    Bonjour,

    J'ai une petite question sur les mots-clés utilisés pour l'héritage.

    J'ai une classe abstraite GenericAbstractClass qui a une méthode compute qui rend un objet GenericObject.

    J'ai deux types dérivées : A et B. On a donc respectivement une classe AClass et BClass qui dérivent de GenericAbstractClass et AObject et BObject qui dérivent de GenericObject.

    Est-ce que je peux redéfinir compute dans AClass et dans BClass pour qu'elle rende respectivement AObject et BObject ?

    Je fais pour l'instant dans GenericAbstractClass :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public abstract GenericObject compute()
    j'aimerais avoir un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public abstract new AObject compute()
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public abstract new BObject compute()

    [Edit : AClass et BClass sont également abstraites, le but c'est d'avoir des classes A1Class, A2Class, etc... qui sachent qu'on rende un AObject]
    [Re-Edit : une solution ça serait de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public override GenericObject compute(){return this.computeA();}
    public abstract AObject computeA()
    Mais, euh, bof.
    ]

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Ce que tu veux faire n'est pas possible (on ne peut pas redéfinir une méthode en changeant juste son type de retour) en revanche l'utilisation des classes ou méthodes génériques t'apporte ici une solution (c'est fait pour cela d'ailleurs).

  3. #3
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    en revanche l'utilisation des classes ou méthodes génériques t'apporte ici une solution (c'est fait pour cela d'ailleurs)
    Donc, quelle est la meilleur méthode (?) pour ensuite implémenter une A1Class qui sache qu'elle doive rendre un AObject et ensuite l'utiliser comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A1Class A1 = new A1Class()
    GenericObject obj = A1.compute()
    (obj sera un AObject)

  4. #4
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour.

    D'abord, est-ce vraiment nécessaire ? Les consommateurs de ces classes ont-ils vraiment besoin de savoir qu'ils manient un AObject plutôt qu'un GenericObject ? Si oui, c'est obligatoirement parce que AObject ajoute des fonctionnalités en plus de celles de GenericObject. Dans ce cas, ok, l'héritage est une des façons de faire ça (il y en a d'autres, voir le pattern décorateur par exemple).

    Dans ce cas, il n'y a qu'une façon directe de faire ça : définir de nouvelles méthodes, distinctes, dans AClass et BClass. Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class AClass : GenericAbstractClass
    {
       override GenericObject compute() { return computeA(); }
       AObject computeA() {...}
    }
    Ou, avec une version générique de GenericAbstractClass :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class AClass : GenericAbstractClass<AObject>
    {
       override AObject compute() {...}
    }
    J'insiste bien, ceci n'est nécessaire que si des classes tierces (ni AClass ni AObject) ont besoin de fonctionnalités (méthodes, champs) qui n'existent pas dans GenericObject, uniquement dans AClass.

  5. #5
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Par défaut
    Citation Envoyé par DonQuiche
    D'abord, est-ce vraiment nécessaire ? Les consommateurs de ces classes ont-ils vraiment besoin de savoir qu'ils manient un AObject plutôt qu'un GenericObject ? Si oui, c'est obligatoirement parce que AObject ajoute des fonctionnalités en plus de celles de GenericObject. Dans ce cas, ok, l'héritage est une des façons de faire ça (il y en a d'autres, voir le pattern décorateur par exemple).

    Dans ce cas, il n'y a qu'une façon directe de faire ça : définir de nouvelles méthodes, distinctes, dans AClass et BClass. Par exemple
    OK... J'ai fait ce que tu proposais avec l'héritage, je trouvais ça bof mais tu confirmes qu'on ne peut faire autrement. Je cherchais des techniques moins lourdes, je vais regarder le pattern décorateur (ça en devient artistique ma parole).

    Oui, les classes qui vont utiliser le résultat de compute() peuvent avoir besoin de savoir à quoi elles ont affaire, dans ce cas je regarde le type et je caste en conséquence. Mais elles peuvent ne pas avoir besoin non plus et dans ce cas là j'utilise directement les méthodes de GenericObject.

    Merci DonQuiche & Bluedeep.

  6. #6
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Je t'en prie. Note que j'ai ajouté une version générique. Enfin tu as aussi toutes les façons indirectes : passer par des tiers créateurs (patterns Factory, etc) ou encore inverser le contrôle (créer un constructeur de AObject qui accepte un AClass en argument).

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

Discussions similaires

  1. Questions sur l'héritage multiple
    Par beegees dans le forum C++
    Réponses: 12
    Dernier message: 31/03/2008, 17h01
  2. Question sur l'héritage (débutant en C++)
    Par beegees dans le forum C++
    Réponses: 19
    Dernier message: 30/03/2008, 14h45
  3. petite question sur l'héritage et les cast
    Par baedal dans le forum Langage
    Réponses: 3
    Dernier message: 29/02/2008, 00h48
  4. Questions sur l'héritage dans Matisse
    Par Cassios dans le forum NetBeans
    Réponses: 8
    Dernier message: 14/03/2007, 23h23
  5. Question sur l'héritage
    Par the big ben 5 dans le forum Delphi
    Réponses: 28
    Dernier message: 06/06/2006, 17h27

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