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 :

Héritage de classe abstraite


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Par défaut Héritage de classe abstraite
    Bien le bonjour,

    Je m'adresse à vous parce que cela fait un petit moment que je n'ai pas développé en C#, et que pour me remettre un peu à niveau je me suis amusé à faire une petite application dans ce langage, sauf que je remarque certaines petites choses qui me contrarient, que je ne comprend pas (plus?) ! La plupart du temps je trouve des réponses/solutions à mes questions/problèmes sur le net et assez régulièrement sur ce forum.

    Aujourd'hui, je suis confronté à un nouveau problème qui me pose quelques difficultés, c'est un cas assez précis et je ne trouve rien sur la toile qui pourrait m'aider, c'est donc tout naturellement que je me suis inscrit sur ce dit forum afin de vous y poser ma question.

    Le cas est assez simple, je définit d'une classe abstraite qui dispose de 3 variables statiques et 2 méthodes (statiques également) traitant sur ces variables, héritée par trois autres classes. Mon but, bien évidemment, est de pouvoir définir des valeurs différentes à ces variables selon la classe que j'utilise. Pour initialiser ces fameuses variables (qui commencent à me prendre la tête !), j'ai définit des constructeurs statiques donnant des valeurs différentes dans mes trois classes. Le hic, c'est que ces trois classes verront à coup sûr les valeurs de leurs variables être égales. Pour être plus clair, les valeurs des variables de ces trois classes vaudront celles de la dernière classe ayant exécuté son constructeur statique!
    Déjà, en soi, je trouve cela aberrant que des variables statiques héritées ne puissent pas être différentes selon la classe qui en héritent, même si, puisqu'elles sont statiques, elles pointent finalement vers celles de la classe mère. Cela signifie simplement que l'héritage de variables statiques est complétement superflues, ce qui est dommage. Mais pour le coup, je ne vois pas comment résoudre mon cas. J'aimerais éviter d'avoir à implémenter mes variables statiques dans chaque classe juste parce que leurs valeurs diffèrent, ainsi que leurs méthodes statiques qui seraient identiques dans chaque cas.

    J'ai essayé plusieurs méthodes pour essayer de m'en sortir, toutes aussi vaines les unes que les autres (je m'en rendais à chaque fois compte en les mettant en application), aussi je me tourne vers vous, en espérant (sans en avoir le moindre doute) que vous ayez une solution à me proposer.

    En espérant avoir été clair, merci d'avance de vos futures réponses.

  2. #2
    Membre expérimenté Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Par défaut
    Bonjour,
    Quelle est l'utilité d'ajouter static aux variables et aux methodes et au constructeur?

  3. #3
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    C'est peut être possible dans d'autres langages (me semble avoir vu que Delphi avait quelque chose qui y ressemble), mais en .Net les notions de "static" et d'héritage sont orthogonales. Pourquoi as-tu besoin de rendre ces membres statiques ? Et comment espères-tu les faire hériter, puisque par définition l'appel d'un membre statique nécessite de connaître statiquement (c'est à dire dans ton code, pas au runtime) le type dont on appelle une méthode ?

    Si tu veux faire de l'héritage, ne fais pas de méthode statique.

    Et le constructeur statique n'a de constructeur que le nom; ce n'est qu'une méthode dont on est sûr qu'elle est appelée avant toute référence à la classe (c'est plus compliqué que ça mais là n'est pas la question), et n'a pas sa place dans une classe "classique", qui a vocation à être dérivée.

  4. #4
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Par défaut
    Merci pour vos réponses aussi rapides.

    Les constructeurs statiques dont j'ai parlé ne sont pas dans la classe mère abstraite mais dans les 3 autres, et sert à être sûr que les variables soient initialisées avant toute chose.
    Presque toutes les méthodes de ces classes font des traitements sur ces variables dont la valeur n'est pas modifiée en fonction de l'instance, c'est pourquoi il me parait logique qu'elles soient statiques.
    De même, les méthodes mises en statiques doivent pouvoir être appelées non pas en fonction d'une instance de classe mais depuis la classe elle-même, d'où l'intérêt qu'elles soient statiques également. Ces méthodes font le même traitement qu'importe la classe dans lesquelles elles se trouvent, c'est pourquoi j'ai jugé préférable de faire hériter ces classes d'une autre qui les implémente, afin d'éviter la redondance de code et d'être sûr que lorsque j'utilise ces classes je puisse appeler ces méthodes.
    Les variables sont du coup héritées également, car elles sont nécessaires au traitement de ces méthodes, la classe abstraite me renverrait une erreur si elle ne les possédaient pas, et de la même façon que les méthodes, je veux être sûr qu'elles se trouvent dans les classes héritant de ma classe abstraite.

    Décidément ça coince ça coince!

  5. #5
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par BlackTutu Voir le message
    Presque toutes les méthodes de ces classes font des traitements sur ces variables dont la valeur n'est pas modifiée en fonction de l'instance, c'est pourquoi il me parait logique qu'elles soient statiques.
    Oui mais si tu veux que des classes filles puissent changer ces valeurs, tu dois les rendre abstraites (ou virtuelles).

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Carré
    {
      public int Calculer()
      {
        return x * x;
      }
      protected abstract int x { get; }
    }
     
    class CarréDeHuit : Carré
    {
       protected override int x { get { return 8; }
    }
    De même, les méthodes mises en statiques doivent pouvoir être appelées non pas en fonction d'une instance de classe mais depuis la classe elle-même, d'où l'intérêt qu'elles soient statiques également.
    D'où te vient cette contrainte ?
    Tu remarqueras, on observant le framework .Net, que rares sont les classes qui proposent beaucoup des méthodes statiques et sont en plus héritées. Les classes statiques représentent des constantes de l'appli / des constantes tout court, comme par exemple la config de l'appli, les infos sur le système, les opérations mathématiques, ... Bref des catalogues de propriétés et de méthode hors contexte, où l'héritage n'intervient pas.

    Il faudrait voir ton code. Il y a de fortes chances que ton besoin soit simple, mais que ne connaissant pas de meilleure solution tu te lances dans une impasse (ce qui est normal hein, j'arrête pas, c'est au pied du mur que l'on voit le mieux le mur )

  6. #6
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Par défaut
    Le problème c'est que je ne peux pas les mettre "abstract" tant qu'elles sont statiques.

    Effectivement, j'ai de plus en plus l'impression d'être face à une impasse, c'est pourquoi je vais révéler un peu plus l'objet de l'application.

    Il s'agit, en réalité, d'un petit programme dans lequel on entre des numéros d'une roulette de casino, afin que certaines statistiques soient faites et qu'il propose un conseil de jeu (ce n'est pas très élaboré, les conseils se limitent aux coups dont la probabilité est d'un demi, c'est à dire la couleur, la parité et la taille). Je dispose donc d'une classe "Numéro" et d'une autre "ListeNuméros" qui contient entre autre une collection de "Numéro". La classe "Numéro" contient 3 références d'instance vers les classes "Couleur", "Parité" et "Taille". Ce sont ces classes qui contiennent les attributs statiques "PROPRIÉTÉ1" et "PROPRIÉTÉ2", qui doivent valoir respectivement "ROUGE" et "NOIR", "PAIRE" et "IMPAIRE" et "GRAND" et "PETIT", et une variable d'instance qui vaut une de ces variables statiques. Les méthodes abstraites comptent, à partir de la classe "ListeNuméros" le nombres de "Numéro" ayant pour référence des instances qui valent la propriété passée en paramètre.

    Je ne sais pas si j'ai été assez clair, en tout cas en écrivant ces lignes, l'impasse se lève. Il est évident que je fais fausse route depuis le début. C'est la classe "ListeNuméros" qui est censée faire le comptage, et non les trois classes. Je suppose que vous me confirmerez ce dernier avis?

Discussions similaires

  1. [DC] Héritage et classes abstraites
    Par leminipouce dans le forum Diagrammes de Classes
    Réponses: 7
    Dernier message: 08/01/2008, 16h14
  2. pb héritage sur classe abstraite et iterator
    Par black-falco dans le forum C++
    Réponses: 21
    Dernier message: 05/01/2008, 16h38
  3. Héritage et classes abstraites
    Par Mic75 dans le forum C++
    Réponses: 2
    Dernier message: 30/10/2007, 17h06
  4. Problème héritage et classes abstraites
    Par sebzinzin dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2007, 18h24
  5. héritage et classes abstraites
    Par reloadead dans le forum Langage
    Réponses: 5
    Dernier message: 31/01/2007, 10h08

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