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 :

Base : Classe abstraite et constructeur


Sujet :

ASP.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut Base : Classe abstraite et constructeur
    Bonjour à tous,

    Ceci est une question concernant les bases en C# (je viens du monde VB et je viens de me mettre au C# histoire d'etre ok sur les deux langages).

    J'ai une classe abstraite "BaseService" comme suit
    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
    abstract class BaseService
        {
            protected IBaseService _service;
     
            public BaseService(IBaseService ioc)
            {
                _service = ioc;
            }
     
    public IList<Object> GetAll(IBaseService ioc)
            {
                return _service.GetAll();
            }
     
        }
    J'ai une classe "SProducts" qui hérite de "BaseService"
    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
     
    class SProducts : BaseService
        {
            new protected IProducts _service;
     
            public SProducts(IProducts ioc)
            {
                _service = ioc;
            }
     
            public IList<Products> GetValidProducts()
            {
                return _service.GetValidProducts();
            }
        }
    Lorsque mes méthodes de base figurant dans la classe mere BaseA font appel à _service, je reçois une exception comme quoi _service est à null.
    Ce que j'ai fait pour pallier à ce problème c'est de modifier le constructeur de "SProducts" comme suit :
    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
    class SProducts : BaseService
        {
            new protected IProducts _service;
     
            public SProducts(IProducts ioc)
            {
                _service = ioc;
                base._service = ioc;
            }
     
            public IList<Products> GetValidProducts()
            {
                return _service.GetValidProducts();
            }
        }
    Je suis donc obligé de faire deux assignations au constructeur : une pour la classe fille et une pour la classe de base dont elle hérite.

    Est-ce normal ou bien ai-je raté un épisode quelque part ?
    Logiquement, le fait d'assigner une valeur à l'attribut de la classe fille devrait automatiquement "assigner" la même chose à la classe mère vu qu'on travaille sur le même attribut non ?

    Merci d'avance pour vos réponses

  2. #2
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Salut,

    C'est pas un coup à s'emméler les pinceaux? Pourquoi veux-tu l'assigner en même temps dans la classe fille et parent? Assigne seulement le parent, non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public FilleA(IToto ioc)
    	: base(ioc)
    {
     
    }
    IBaseToto et IToto sont différentes?

    A+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    J'ai modifié les noms de mon premier topic pour que ce soit un peu plus explicite. Pour ce qui est du retour de la méthode GetAll de la classe BaseService, je sais que je peux jouer avec les génériques et le mot clef T mais pour l'exemple ce n'est pas nécessaire, cela ne change rien au probleme.

    SProducts hérite de BaseService
    ISProducts hérite de IBaseService (qui sont bien des interfaces en cas de doute)

    Mon problème se situe ici :
    Dans BaseService tu as une méthode GetAll() qui fait appel à _service qui fait partie de IBaseService
    Dans ISProducts tu as une méthode GetValidProducts qui appelle aussi _service mais qui fait partie de ISProducts

    Si dans le constructeur de SProducts j'initialise seulement l'attribut _service de SProducts, quand je fais appel à GetAll() il me dit que _service de BaseService est à null.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Je viens de trouver...

    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
    abstract class BaseService
        {
            protected IBaseService _service;
     
            public BaseService(IBaseService ioc)
            {
                _service = ioc;
            }
     
    public IList<Object> GetAll(IBaseService ioc)
            {
                return _service.GetAll();
            }
     
        }
    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
     
    class SProducts : BaseService
        {
            new protected IProducts _service;
     
            public SProducts(IProducts ioc) : base(ioc)
            {
                _service = ioc;
            }
     
            public IList<Products> GetValidProducts()
            {
                return _service.GetValidProducts();
            }
        }
    Merci de ton aide Immobilis

  5. #5
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    En faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public SProducts(IProducts ioc) : base(ioc)
    Tu ne devrais pas avoir besoin de faireLe constructeur de la classe de base le fait.

    A+

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Salut,

    oui effectivement, tu as raison Merci !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Je détagge le topic car le problème n'est pas résolu. Je n'avais pas testé car j'etais en train d'implementer mes wrappers, donc pas de possibilité de test.
    Bon grosso modo en faisant comme indiqué, la classe fille se retrouve avec un attribut à null.

    Si je fais comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class SProducts : BaseService
        {
            new protected IProducts _service;
     
            public SProducts(IProducts ioc) 
    : base(ioc) { }
     
            public IList<Products> GetValidProducts()
            {
                return _service.GetValidProducts();
            }
        }
    La méthode GetValidProducts accedant à _service retourne une exception comme quoi _service est null alors que normalement il est initialisé par le "base(ioc)".

    Par contre en faisant comme 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
    class SProducts : BaseService
        {
            new protected IProducts _service;
     
            public SProducts(IProducts ioc) : base(ioc)
            {
                _service = ioc;
            }
     
            public IList<Products> GetValidProducts()
            {
                return _service.GetValidProducts();
            }
        }
    Tout fonctionne. Ce que je trouve louche, c'est que le base(ioc) initialise _service dans la classe abstraite et _service(ioc) l'initialise dans la partie classe fille. C'est comme si on avait deux attributs différents... Ce qui me parait vraiment bizarre.
    Je soupçonne le "new protected" d'impliquer ce comportement bizarre.

  8. #8
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Je te déconseille de faire des déclarations du même objet dans les classes mère et fille, surtout avec les mêmes noms de variables et de propriétés. Pourquoi le fais-tu d'ailleurs?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Beh en fait je me pose des questions là (bon en meme temps je ne suis pas habitué au C# et je crois que je n'ai jamais codé ce que je suis en train de faire). Dans les exemples que j'ai donné, j'ai merdouillé au niveau du nommage, donc ca peut porter à confusion.

    Peux tu me dire comment tu ferais ceci :
    Tu as une classe abstraite qui possède un attribut qui est une interface de base.
    Tu herites de cette classe abstraite dans une nouvelle classe sauf que l'attribut en question est lui meme une interface héritant de celle qui est dans la classe abstraite.
    Ceci pour permettre d'avoir un traitement standard au niveau de la classe abstraite et un traitement spécifique dans la classe fille.

    Donc le "new protected" de la classe fille permet de spécifier l'interface héritant de l'interface de base afin de pouvoir utiliser les méthodes spécifiques.

    Bref, pour résumer : une classe abstraite qui fait appel à des méthode d'un service abstrait et une classe fille qui hérite de la classe abstraite et qui fait appel aux méthodes abstraites (via l'héritage) et aux méthodes spécifiques à la classe fille.

    C'est super chaud à expliquer, je ne sais pas si tu vas pouvoir comprendre

  10. #10
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Citation Envoyé par zax-tfh Voir le message
    Donc le "new protected" de la classe fille permet de spécifier l'interface héritant de l'interface de base afin de pouvoir utiliser les méthodes spécifiques.
    Une interface qui hérite d'une autre? Mmmhh. J'aurais plutôt fait une classe qui implemente plusieurs interfaces.
    Citation Envoyé par zax-tfh Voir le message
    C'est super chaud à expliquer, je ne sais pas si tu vas pouvoir comprendre
    C'est un peu abstrait je dois dire...


    A+

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 182
    Points : 12 322
    Points
    12 322
    Par défaut
    Je comprend rien sauf que le mot clé "new", tel qu’il est utilisé ici sert à planquer un champ de la classe de base par un autre champ dans la classe fille. Le champ de la classe de base n'est plus accessible (sauf depuis le code de la classe de base, d'où la différence de comportement).

    Donc PAS de "new protected"

Discussions similaires

  1. Réponses: 15
    Dernier message: 05/07/2007, 01h29
  2. Réponses: 2
    Dernier message: 18/04/2007, 13h34
  3. Réponses: 14
    Dernier message: 17/11/2006, 19h17
  4. Classe abstraite et constructeurs
    Par koala01 dans le forum C++
    Réponses: 6
    Dernier message: 21/08/2006, 01h00
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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