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

ASP.NET Discussion :

appeler le contructeur d'une classe dérivée depuis la classe de base


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 123
    Points : 85
    Points
    85
    Par défaut appeler le contructeur d'une classe dérivée depuis la classe de base
    Bonjour,

    Appeler une méthode ou un contructeur de base depuis une classe dérivée, c'est facile (avec le mot clé base), mais là c'est l'inverse :

    Je développe une classe abstraite (donc destinée uniquement à servir de classe de base), mais pour l'une des méthodes, j'ai besoin de retourner une nouvelle instance de la classe dérivée. (Je ne peux créer une nouvelle instance de la classe de base car elle est abstraite, et même si elle ne l'était pas, un sub-transtypage brutal vers une classe plus évolué serait invalide car cette classe plus évoluée n'aurait pas été construite

    J'avais pensé à l'obligation de founir le type en paramètre, mais après qu'en faire ?

    J'ai aussi pensé à ceci :
    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
     
     
    public abstract MaBase(){
     
        protected abstact MaBase CreateNewClasse();
     
        public MaBase MaMethode(){
            MaBase ToReturn = CreateNewClasse(); 
            ....
            return ToReturn;
        }
     
        public MaBase (){
            ...
        }
     
    }
    Ce qui impose dans la classe dérivée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public MaClasseDerivee : MaBase {
     
        protected override MaBase CreateNewClasse(){
            return (MaBase) new MaClasseDerivee();
        }
     
    }
    Mais je pense qu'il doit y avoir plus simple ... J'ai le sentiment de faire fausse route.

  2. #2
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Pour moi, c'est un problème de conception.
    Tu dois pas appeler une classe fille depuis la classe mère

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    A mon avis, il te manque une interface que ta classe abstraite implémente.

    Ta méthode retourne ensuite un objet de cette interface et pas de la classe abstraite.

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Clairement un problème de design ici.
    Je pense que la réponse est plutôt à chercher du coté d'une Factory.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Vous voyez un problème dans ce genre de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
        public interface IBase {
            IBase MaMethode();
        }
     
        public abstract class MaBase : IBase {
            public abstract IBase MaMethode();
        }
     
        public class Derive : MaBase {
            public override IBase MaMethode() { return new Derive(); }
        }
    C'est exactement ce qu'il veut faire.

    Sa méthode retourne un objet de la classe dérivée, pas de classe mère en fait. Il faut donc utiliser une interface et c'est là son erreur à mon sens.

  6. #6
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    Vous voyez un problème dans ce genre de code :
    Non, pas de problème...L'interface n'est même pas obligatoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
        public abstract class MaBase {
            public abstract MaBase MaMethode();
        }
     
        public class Derive : MaBase {
            public override MaBase MaMethode() { return new Derive(); }
        }
    fonctionne aussi.

    Mais bon, là on est en pleine théorie abstraite...Dans un cas concret je serais également plus porté vers une factory...A voir avec plus de détails.
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Il faut effectivement une Factory.

    Parfois, faut lire un peu moins en diagonale les posts

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 123
    Points : 85
    Points
    85
    Par défaut
    Merci pour vos réponses,

    Je vais étudier ce concept de Factory ...

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

Discussions similaires

  1. Comment appeler une méthode père depuis la classe père
    Par Ketchup666 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2009, 12h14
  2. Accèder à une classe fille depuis la classe mère
    Par Phreak0x dans le forum Windows Forms
    Réponses: 3
    Dernier message: 28/10/2008, 10h14
  3. Réponses: 3
    Dernier message: 07/03/2007, 11h38
  4. Appel de fonctions d'une DLL C++ depuis Java
    Par max_rossito dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 11/01/2007, 22h54
  5. Réponses: 5
    Dernier message: 07/04/2006, 01h18

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