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 :

Appelé fonction après constructeur de la classe enfant


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Points : 185
    Points
    185
    Par défaut Appelé fonction après constructeur de la classe enfant
    Bonjour,

    Soit 2 classes

    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
     
    abstract class Parent
    {
     public Parent()
    {
    }
     
    protected abstract void init();
    }
     
    class Enfant : Parent
    {
     public Enfant()
    {
    }
     
    protected override void init()
     {
    // des choses...
    }
    }
    je voudrais que init() soit appelé directement après que le constructeur de Enfant soit éxécuté mais l'appel doit se faire à partir de la classe Parent.

    Une idée?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par escafr Voir le message
    après que le constructeur de Enfant soit éxécuté mais l'appel doit se faire à partir de la classe Parent.
    Donc tu veux que ta classe Parente mettre du code dépendant des classes dérivées ? pas terrible d'un point de vue concept objet.

    Citation Envoyé par escafr Voir le message
    je voudrais que init() soit appelé directement après que le constructeur
    pas possible non plus. On ne peut pas en c# forcer une ordre d'appel dans les méthodes.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Points : 185
    Points
    185
    Par défaut
    roo mais c'est le bon vieux pattern des familles "je sais plus cmt il s'appelle" appliqué au constructeur

    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
    26
     
    class Parent 
    {
     protected virtual void beforeEvent() {}
     protected virtual void afterEvent() {}
     protected virtual void doEvent() {}
     
     private void event() 
    {
    // du code du parent
    beforeEvent();
    // du code du parent
    doEvent();
    // du code du parent
    afterEvent();
    // du code du parent
    }
     
    }
     
    class Enfant 
    {
     protected override void beforeEvent() {//Du code}
     protected override void afterEvent() {//Du code}
     protected override void doEvent() {//Du code}
    }
    c'est vachement utilisé pour tout ce qui est UI.. mais forcement c'est pas applicable au constructeur..
    c'etait juste au cas ou...

    mon pb c'est qu'il faut que j'attende que le constructeur de Enfant soit terminé pour lancer init()...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par escafr Voir le message
    roo mais c'est le bon vieux pattern des familles "je sais plus cmt il s'appelle" appliqué au constructeur
    Tu parles du pattern Template Method il me semble

    Mais pour les constructeurs, c'est un peu différent : le constructeur de la classe dérivée n'est pas un override du constructeur de la classe de base. Celui de la classe de base est obligatoirement exécuté avant celui de la classe dérivée, donc quand le constructeur de la classe dérivée commence à être exécuté, celui de la classe de base est déjà terminé...

    Une solution serait d'avoir plusieurs méthodes Init, par exemple BeforeInit, Init et AfterInit. Si tu as besoin d'exécuter des choses avant l'appel à Init dans ta classe dérivée, tu le fais en overridant BeforeInit :

    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
    26
    27
    28
    29
    30
    31
    32
    abstract class Parent
    {
        public Parent()
        {
            BeforeInit();
            // ...
            Init();
            // ...
            AfterInit();
        }
     
        protected virtual void BeforeInit() { };
        protected abstract void Init();
        protected virtual void AfterInit() { };
    }
     
    class Enfant : Parent
    {
        public Enfant() // appelle implicitement le constructeur de Parent
        {
        }
     
        protected override void BeforeInit()
        {
            // des choses...
        }
     
        protected override void Init()
        {
            // des choses...
        }
    }

    Question intéressante en tous cas

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Points : 185
    Points
    185
    Par défaut
    je peux pas faire ca non plus.

    il me fait vraiment attendre la fin du constructeur d'Enfant.
    pq en fait mes classes sont plutot comme ca:

    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
     
    abstract class Parent
    {
     public Parent()
    {
    }
     
    protected abstract void init();
    }
     
    class Enfant : Parent
    {
     public Enfant(unType unObj): base()
    {
    _unObj = unObj;
    }
     
    private unType _unObj;
     
    protected override void init()
     {
       faisQqueChoseAvc(_unObj);
     }
    }
    donc l'objet unObj ne sera initialisé que lorsque le constructeur de Enfant sera terminé...
    et je crois pas qu'on puisse initialisé comme en C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Enfant(unType unObj): _unObj(unObj), base()
    {
    }
    ce qui resoudrait mon pb...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Pourquoi ne pas utiliser une Factory Method dans ce cas pour avoir un code du genre

    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
        class Enfant : Parent
        {
            public static Enfant CreateNew(object unObj) 
            {
                Enfant newItem = new Enfant(unObj);
                newItem.AfterInit();
                return newItem;
            }
     
            private object _unObj;
            protected Enfant(object unObj) 
            {
                this._unObj=unObj;
            }
     
     
            protected void AfterInit()
            {
                // des choses...
            }
        }

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Ah ok, je comprends mieux le problème... ben je vois pas trop comment tu pourrais éviter d'appeler init() explicitement alors

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Points : 185
    Points
    185
    Par défaut
    @cybermaxs : ahh!! bien vu!!!

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par escafr Voir le message
    @cybermaxs : ahh!! bien vu!!!
    ouais mais bon, une factory ne règle pas vraiment le problème : tu es toujours obligé de faire du spécifique dans la classe dérivée, tu ne peux pas tout gérer dans la classe de base...

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Février 2003
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 224
    Points : 185
    Points
    185
    Par défaut
    effectivement.. jme suis un peu emballé.. dure journée..

    tout pourri le C# c'est vachement mieux le C++..

    et hop un ptit troll de fin de journée, histoire de...

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par escafr Voir le message
    tout pourri le C# c'est vachement mieux le C++..
    Ca ne mérite même pas de réponse... don't feed the troll

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

Discussions similaires

  1. Appel d'un constructeur d'une classe Java
    Par Invité dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/02/2015, 09h31
  2. Réponses: 12
    Dernier message: 25/07/2009, 16h59
  3. Appeler Fonction d'un module de Classe
    Par PtitSuisse dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/06/2008, 17h07
  4. Réponses: 12
    Dernier message: 13/10/2007, 11h37
  5. appel fonction après <body =onload>
    Par taffMan dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 27/11/2006, 21h23

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